我有一张图片,其中我正在尝试将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()
答案 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)
我得到的输出图像是
两个新月形都正确安装,底部与月亮相匹配而不是新月形。您可以进行一种滞后跟踪并移动该圆,直到它的外边缘正好相当一致地位于新月处。
如果您恰好调整参数,可以删除一个额外的圆圈,但过滤您需要的确切圆圈取决于您。 F.E.如果你只想要顶部新月要求最小的y
坐标,如果所有的阴影都是这么大,你可以只要求半径大于某个阈值的圆等......