python opencv - 像素操作后的 HoughCircles 错误
python opencv - HoughCircles error after pixel manipulation
def detect_circles():
img = cv2.imread('img.JPG', 0)
#img = cv2.medianBlur(img, 3)
#cim= cv2.GaussianBlur(img, (15, 15), 0)
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img, cv2.cv.CV_HOUGH_GRADIENT, 1, 30,param1=100,param2=39,minRadius=25,maxRadius=70)
circles = np.uint16(np.around(circles))
count = 0
for i in circles[0, :]:
count = count + 1
# draw the outer circle
cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2)
# draw the center of the circle
cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3)
cv2.imwrite('circles_detected.JPG', cimg)
print(count)
此函数旨在检测图像中的圆圈。
它工作正常,但我需要区分颜色。
所以我写了这个函数,将每个像素的 G 和 R 值设置为 0。
def iterate_image():
img = read_img('SDC10004.JPG')
height = img.shape[0]
width = img.shape[1]
for i in range(height):
for j in range(width):
#img.itemset((i,j, 0), 100)
img.itemset((i,j, 1), 0)
img.itemset((i,j, 2), 0)
write_img(img,'SDC10004_selfmade_blue.JPG')
当我尝试用蓝色像素图像检测圆圈时,我收到此错误消息:
Traceback (most recent call last):
File "/home/user/Documents/workspace/ImageProcessing/Main.py", line 107, in <module>
detect_circles();
File "/home/user/Documents/workspace/ImageProcessing/Main.py", line 94, in detect_circles
circles = np.uint16(np.around(circles))
File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 2610, in around
return _wrapit(a, 'round', decimals, out)
File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 43, in _wrapit
result = getattr(asarray(obj), method)(*args, **kwds)
AttributeError: rint
有没有人遇到过这个?
所以,我相信我发现了这里的问题所在。
HoughCircles 并不复杂,您只需要注意它的参数化即可。该方法基于 Canny 边缘检测器,它反过来对灰度图像进行阈值处理。
opencv 用于灰度图像的 formula 由以下公式给出:
RGB_to_Gray: 0.299.R + 0.587.G + 0.114.B
由于您正在将三个 RGB 通道中的两个归零,因此灰度值的强度将会降低。因此,您的阈值避免了任何圆检测和 cv2.HoughCircles returns None。因此,由于您没有测试 circles 是否属于 None 类型,因此当您尝试执行 np.around(None).
在 cv2.HoughCircles 上调整 param1 应该可以解决问题。
param1 – First method-specific parameter. In case of CV_HOUGH_GRADIENT
, it is the higher threshold of the two passed to the Canny() edge
detector (the lower one is twice smaller)
HoughCircles param1 source.
def detect_circles():
img = cv2.imread('img.JPG', 0)
#img = cv2.medianBlur(img, 3)
#cim= cv2.GaussianBlur(img, (15, 15), 0)
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img, cv2.cv.CV_HOUGH_GRADIENT, 1, 30,param1=100,param2=39,minRadius=25,maxRadius=70)
circles = np.uint16(np.around(circles))
count = 0
for i in circles[0, :]:
count = count + 1
# draw the outer circle
cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2)
# draw the center of the circle
cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3)
cv2.imwrite('circles_detected.JPG', cimg)
print(count)
此函数旨在检测图像中的圆圈。 它工作正常,但我需要区分颜色。 所以我写了这个函数,将每个像素的 G 和 R 值设置为 0。
def iterate_image():
img = read_img('SDC10004.JPG')
height = img.shape[0]
width = img.shape[1]
for i in range(height):
for j in range(width):
#img.itemset((i,j, 0), 100)
img.itemset((i,j, 1), 0)
img.itemset((i,j, 2), 0)
write_img(img,'SDC10004_selfmade_blue.JPG')
当我尝试用蓝色像素图像检测圆圈时,我收到此错误消息:
Traceback (most recent call last):
File "/home/user/Documents/workspace/ImageProcessing/Main.py", line 107, in <module>
detect_circles();
File "/home/user/Documents/workspace/ImageProcessing/Main.py", line 94, in detect_circles
circles = np.uint16(np.around(circles))
File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 2610, in around
return _wrapit(a, 'round', decimals, out)
File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 43, in _wrapit
result = getattr(asarray(obj), method)(*args, **kwds)
AttributeError: rint
有没有人遇到过这个?
所以,我相信我发现了这里的问题所在。
HoughCircles 并不复杂,您只需要注意它的参数化即可。该方法基于 Canny 边缘检测器,它反过来对灰度图像进行阈值处理。
opencv 用于灰度图像的 formula 由以下公式给出:
RGB_to_Gray: 0.299.R + 0.587.G + 0.114.B
由于您正在将三个 RGB 通道中的两个归零,因此灰度值的强度将会降低。因此,您的阈值避免了任何圆检测和 cv2.HoughCircles returns None。因此,由于您没有测试 circles 是否属于 None 类型,因此当您尝试执行 np.around(None).
在 cv2.HoughCircles 上调整 param1 应该可以解决问题。
param1 – First method-specific parameter. In case of CV_HOUGH_GRADIENT , it is the higher threshold of the two passed to the Canny() edge detector (the lower one is twice smaller)
HoughCircles param1 source.