霍夫圆变换用于圆形阴影的转换

6

我有一张图片,想要对其中的圆形对象应用Hough圆变换。

我发现很难找到适合圆柱体外侧阴影的圆。有什么方法可以正确地分割这个阴影并轻松地将其拟合成一个圆吗?

代码:

img = cv2.medianBlur(im,7)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

plt.imshow(cimg)
plt.show()

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,
                            param1=50,param2=150,minRadius=100,maxRadius=0)

circles = np.uint16(np.around(circles))

for i in circles[0,:]:
    # draw the outer circle
    cv2.circle(cimg,(i[0],i[1]),i[2],(255,0,0),10)
    # draw the center of the circle
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),20)

    radius = i[2]
    print 'radius', radius, 'px'

plt.imshow(cimg)
plt.show()

你是指图像顶部的“新月形”区域吗? - Micka
是的 - 图像的上半部分存在着黑暗的阴影。 - Sam
你能提供输入图像吗? - Jonas Adler
尝试使用minEnclosingCircle函数。参见此处的示例。 - dhanushka
你能否添加没有坐标轴和透明通道的原始图像? - Rick M.
@RickM. 添加了另一张图片。 - Sam
2个回答

2

您要分割的阴影是迄今为止最暗的区域。我建议使用阈值来过滤掉所有更亮的像素。如果仍然存在噪点,则可以使用 Connected Components 找到最大的“斑块”。一旦阴影是唯一剩下的东西,所有其他像素都设为 0,那么我会尝试以上所述的 minEnclosingCircle 方法(由 dhanushka 推荐)。


2

我只是写出代码而不解释,因为有很多函数,我不想假设你知道或不知道什么,并花费很长时间进行编写。如果您有任何问题,请随时问,我会在帖子中添加它们。

您要求将圆形拟合到新月阴影上,因此我已经将圆形拟合到阴影上。重要的是要意识到,在某种生产代码中,我想必须处理大量这种图像,因此需要优化拟合的圆。特别是这种类型的结构分析只关心将给定形状拟合到像素上,而不是您正在寻找的对象。

我故意留下了错误拟合的圆。根据您感兴趣的内容,我建议使用convexHull、Haar检测器或形状匹配。

import cv2 
import numpy as np

img = cv2.imread("orig.png", cv2.IMREAD_GRAYSCALE)

ret, thresh = cv2.threshold(img, 80, 255, cv2.THRESH_BINARY_INV)

ero = cv2.erode(thresh, np.ones((5,5)))
dil = cv2.dilate(ero, np.ones((5,5)))

img, contours, hierarchy = cv2.findContours(dil, cv2.RETR_EXTERNAL,
                                            cv2.CHAIN_APPROX_NONE)

#just for drawing purposes, the cimg is not really required
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
for cnt in contours:
    (x, y), radius = cv2.minEnclosingCircle(cnt)
    center = (int(x), int(y))
    radius = int(radius)
    cv2.circle(cimg, center, radius, (255, 0, 0), 1)

我得到的输出图像是: enter image description here 两个新月形状都与底部的圆桶外侧对齐,而不是完全匹配。您可以执行一种滞后跟踪并移动该圆形,直到其外边缘准确地位于新月形状的位置。调整参数可以去除另一个圆形,但筛选所需的精确圆形取决于您。例如,如果您只想要顶部的新月形状,请请求最小的y坐标;如果所有阴影都像这些一样大,则可以请求半径大于某个阈值的圆形等。请注意保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接