用小畫家隨意畫三個圈分別用紅藍綠,我們利用cv2.inRange
與搭配cv2.bitwise_and
,將紅球過濾出來吧。
因為OpenCV中cv2.imread讀取圖檔預設讀取是為[B,G,R]的格式,所以設置紅色範圍要注意設定在R的範圍內。
cv2.bitwise_and
的用法,簡單來說就是兩張圖合成若顏色相同就保留,若有設定Mask,就是Mask中255的白色部分保留,如下方結果圖呈現一樣。
import cv2
import numpy as np
# 讀取圖像 預設讀取BGR
image = cv2.imread('./RGB.png')
# 設定 RGB 顏色範圍
# 這裡設置的是紅色範圍
lower_bound = np.array([0, 0, 100])
upper_bound = np.array([50, 50, 255])
# 使用 inRange 過濾出指定顏色範圍內的像素
mask = cv2.inRange(image, lower_bound, upper_bound)
# 將遮罩應用於原圖像
result = cv2.bitwise_and(image, image, mask=mask)
# 顯示結果
cv2.imshow('Original Image', image)
cv2.imshow('Mask', mask)
cv2.imshow('Filtered Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.inRange
是 OpenCV 中的一個函數,用於在一個範圍內過濾圖像的像素值。該函數主要用於圖像處理中的閾值操作搭配cv2.bitwise_and
作使用,特別是在顏色空間過濾和二值化操作中非常有用。
mask = cv2.inRange(src, lowerb, upperb)
cv2.bitwise_and
用於對兩個陣列進行「且」操作。這個函數通常用於圖像處理中的遮罩操作,以保留特定區域的像素。
「且」類似操作符 &
作用於每一對對應位置的像素。比如:
但在圖像處理中應用,簡單的說就是保留同樣顏色的像素。
dst = cv2.bitwise_and(src1, src2[, dst[, mask]])
src1
尺寸和類型相同。src1
尺寸和類型相同(可選)。src1
和 src2
尺寸和類型相同。用簡單的範例來理解吧。
import cv2
import numpy as np
# 創建兩個單色圖像
image1 = np.array([[255, 0], [0, 255]], dtype=np.uint8)
image2 = np.array([[255, 255], [0, 0]], dtype=np.uint8)
# 執行「且」操作
result = cv2.bitwise_and(image1, image2)
print("Image 1:")
print(image1)
print("Image 2:")
print(image2)
print("Result of bitwise_and:")
print(result)
如結果圖,只有同為255的狀況下才會保留,其餘為0