霍夫圆转换为圆形阴影

时间:2017-07-25 10:41:20

标签: python opencv geometry hough-transform

我有一张图片,其中我正在尝试将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()

2 个答案:

答案 0 :(得分:2)

您想要分割的阴影是迄今为止最黑暗的区域。我会使用阈值来过滤掉所有更亮的像素。如果仍有噪音,我会使用Connected Components找到最大的" blob"。一旦影子是剩下的唯一东西,所有其他像素都设置为0,我会尝试上面推荐的dhanushka的minEnclosingCircle。

答案 1 :(得分:2)

我只是要编写代码而不是通过它,因为有很多功能,我不愿意假设你知道或不知道的事情,并且花了很长时间进行写作。如果您有任何问题,请随时提出,我会将其添加到帖子中。

你要求在新月形阴影上贴一个圆圈,所以我把圆圈装到了阴影上。重要的是要意识到,在某些生产代码中,我想,必须处理大量这种性质的图像,有必要改进所适合的圆形。特别是这种类型的任何结构分析只是担心将给定的形状拟合到像素,而不是所讨论的对象是你正在寻找的。

我故意在那里留下了错误的圆圈。我建议根据你感兴趣的内容选择凸包,哈尔探测器或形状匹配。

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

两个新月形都正确安装,底部与月亮相匹配而不是新月形。您可以进行一种滞后跟踪并移动该圆,直到它的外边缘正好相当一致地位于新月处。

如果您恰好调整参数,可以删除一个额外的圆圈,但过滤您需要的确切圆圈取决于您。 F.E.如果你只想要顶部新月要求最小的y坐标,如果所有的阴影都是这么大,你可以只要求半径大于某个阈值的圆等......