2024-05-27|閱讀時間 ‧ 約 26 分鐘

[OpenCV][Python]利用cv2.inRange搭配cv2.bitwise_and過濾紅球

用小畫家隨意畫三個圈分別用紅藍綠,我們利用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)

參數

  • src: 輸入圖像,可以是單通道或多通道的圖像(通常是 BGR 或 HSV 顏色空間)。
  • lowerb: 下邊界,用於設置過濾範圍的下限,可以是單一值或元組。
  • upperb: 上邊界,用於設置過濾範圍的上限,可以是單一值或元組。

返回值

  • mask: 通常當mask使用,與輸入圖像具有相同的大小。圖像中的像素值在指定範圍內的像素設置為 255,其餘設置為 0。

cv2.bitwise_and 用於對兩個陣列進行「」操作。這個函數通常用於圖像處理中的遮罩操作,以保留特定區域的像素。

「且」類似操作符 & 作用於每一對對應位置的像素。比如:

  • 1 和 1 進行按位「與」操作的結果是 1
  • 1 和 0 進行按位「與」操作的結果是 0
  • 0 和 0 進行按位「與」操作的結果是 0

但在圖像處理中應用,簡單的說就是保留同樣顏色的像素。

dst = cv2.bitwise_and(src1, src2[, dst[, mask]])

參數

  • src1: 第一個輸入陣列或圖像。
  • src2: 第二個輸入陣列或圖像,與 src1 尺寸和類型相同。
  • dst: 輸出陣列或圖像,與 src1 尺寸和類型相同(可選)。
  • mask: 可選的操作掩碼,指定要處理的像素(可選)。

返回值

  • dst: 輸出陣列或圖像,與 src1src2 尺寸和類型相同。

用簡單的範例來理解吧。

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



分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.