影像的負片效果
這篇教學會使用 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()
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~