OpenCV自學筆記12. 識別影象中的紅色圓形
識別影象中的紅色圓形
本小節用到的影象為:
思路:
解決這個問題的思路如下:
Step2. 根據紅色在HSV顏色空間中的範圍,對影象進行分割。屬於紅色的畫素被保留下來(變為白色),其餘畫素置為黑色。
Step3. 形態學運算,對剛才得到的影象進行膨脹,以使紅色區域更明顯
Step4. 利用Hough變換,提取影象中的圓形
Step5. 繪製圓形
上述思路的程式碼如下:
import cv2
import numpy as np
# Step1. 轉換為HSV
img = cv2.imread('images/00.jpg' )
hue_image = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# Step2. 用顏色分割影象
low_range = np.array([0, 123, 100])
high_range = np.array([5, 255, 255])
th = cv2.inRange(hue_image, low_range, high_range)
# Step3. 形態學運算,膨脹
dilated = cv2.dilate(th, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)), iterations=2 )
# Step4. Hough Circle
circles = cv2.HoughCircles(dilated, cv2.HOUGH_GRADIENT, 1, 100, param1=15, param2=7, minRadius=10, maxRadius=20)
# Step5. 繪製
if circles is not None:
x, y, radius = circles[0][0]
center = (x, y)
cv2.circle(img, center, radius, (0, 255, 0), 2)
cv2.imshow('result', img)
cv2.waitKey(0 )
cv2.destroyAllWindows()
對上述函式做幾點說明:
1、cv2.cvtColor(img, cv2.COLOR_BGR2HSV):將影象由RGB顏色空間轉換到HSV顏色空間(H-色調、S-飽和度、V-亮度)。與RGB相比,HSV更為關注色彩,而不是亮度。因此可以用於提取固定顏色的物體,比如這裡的紅色小球。
cv2.inRange(hue_img, low_range, high_range):low_range 和 high_range決定了色彩的範圍。
dilated = cv2.dilate(th, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)), iterations=2):對影象進行膨脹操作,
函式getStructuringElement,可以獲取常用的結構元素的形狀:矩形(包括線形)、橢圓(包括圓形)及十字形。MORPH_RECT, MORPH_ELLIPSE, MORPH_CROSS
iterations,迭代的次數cv2.HoughCircles(dilated, cv2.HOUGH_GRADIENT, 1, 100, param1=15, param2=7, minRadius=10, maxRadius=20)
程式的執行結果為:
可以看出,程式準確地識別出了圓形~
今天就到這裡, 拜~