识别图像中的红色圆形
本小节用到的图像为:
思路:
解决这个问题的思路如下:
Step1. 首先,将图片由 RGB 颜色空间转换为 HSV 颜色空间,HSV颜色空间可以更直观地反映物体的颜色,便于利用颜色进行分割。有关HSV的相关内容,见以下文章:
http://blog.youkuaiyun.com/viewcode/article/details/8203728
http://blog.youkuaiyun.com/qq61394323/article/details/11226885Step2. 根据红色在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)
程序的运行结果为:
可以看出,程序准确地识别出了圆形~
今天就到这里, 拜~