2017-07-25 183 views
5

我有一个图像,我试图将霍夫圆变换应用到视图中的圆形对象。霍夫圆变换为圆形阴影

我很难找到一个适合圆周的外部阴影的圆。可以做些什么来恰当地分割这个阴影,并轻松地适应一个圆圈?

代码:

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() 
+0

你的意思是“新月”区域图像顶部? – Micka

+0

是的 - 图像上半部分出现的黑影。 – Sam

+0

你能提供输入图像吗? –

回答

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.如果你只想要顶部新月要求最小的坐标,如果所有的阴影都像这些一样大,那么你可以要求只有大于某个阈值的半径的圆等...

2

你正在寻找段的阴影是迄今为止最暗的区域。我会使用阈值过滤掉所有更亮的像素。如果仍有噪声,我会使用Connected Components来查找最大的“blob”。一旦阴影是唯一剩下的东西,所有其他像素都设置为0,我会尝试dhanushka上面推荐的minEnclosingCircle。