负片效果
这篇教学会使用 OpenCV 调整和改变图像的颜色,实现图像的负片效果,再透过遮罩的方法,实现一半负片一半正常画面的效果。
快速导览:
因为程序中的 OpenCV 会需要使用镜头或 GPU,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda ) ,并安装 OpenCV 函数库 ( 参考:OpenCV 函数库 )。
什么是负片效果?
使用底片拍摄时,因为记录在底片上的的明暗与色调与原来景色相反,所以在底片上的图像称之为“负像” ( negative,相反的图像 ),而负片就是“记录负像的底片”,负片效果则是“模拟负片的视觉效果”。
图像的负片效果
因为负片的原理是“相反”,所以只要用 255 的数值,减去图片中每个像素的 RGB 颜色,就能够得到该像素的相反数值,下方的程序一开始运用 img.shape 取得图片尺寸,接着使用 for 循环,将每个像素的颜色变成相反的数值。
import cv2
img = cv2.imread('mona.jpg')
rows = img.shape[0] # 取得高度的總像素
cols = img.shape[1] # 取得寬度的總像素
for row in range(rows):
for col in range(cols):
img[row, col, 0] = 255 - img[row, col, 0] # 255 - 藍色
img[row, col, 1] = 255 - img[row, col, 1] # 255 - 綠色
img[row, col, 2] = 255 - img[row, col, 2] # 255 - 紅色
cv2.imshow('oxxostudio', img)
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()
特定区域套用负片效果
延伸上方的程序码,改变 for 循环里的 rows 为一半的数值 int(rowss/2),就能做到上半部为负片效果的图像。
import cv2
img = cv2.imread('mona.jpg')
rows = img.shape[0]
cols = img.shape[1]
for row in range(int(rows/2)): # 只取 rows 的一半 ( 使用 int 取整數 )
for col in range(cols):
img[row, col, 0] = 255 - img[row, col, 0]
img[row, col, 1] = 255 - img[row, col, 1]
img[row, col, 2] = 255 - img[row, col, 2]
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
更快更好的负片效果做法
因为 OpenCV 打开的图像是 Numpy 数组,所以可以直接使用 NumPy 数组广播的方式,一次套用“255-n”的公式到数组中所有的元素,下方的程序码只使用了一行 255-img,就能做到循环所产生的负片效果。
import cv2
img = cv2.imread('mona.jpg')
img = 255-img # 使用 255 減去陣列中所有數值
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
微信扫码关注
抖音扫码关注