【问题标题】:Hough circle transform to circular shadow霍夫圆变换为圆形阴影
【发布时间】:2017-07-25 10:41:20
【问题描述】:

我有一张图像,我正在尝试将霍夫圆变换应用于视图中的圆形对象。

我很难找到适合圆柱体外部阴影的圆圈。可以做些什么来正确分割这个阴影并轻松地将一个圆圈适合它?

代码:

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

【问题讨论】:

  • 你的意思是图片顶部的“新月”区域?
  • 是的——图像上半部分的暗影。
  • 能否提供输入图片?
  • 试试minEnclosingCircle。有关示例,请参见 here
  • 可以不加坐标轴和alpha通道的原图吗?

标签: python opencv geometry hough-transform


【解决方案1】:

我只是将代码写出来,而不是通过它,因为有很多功能,我不想假设你知道或不知道什么,并花很长时间写。如果您有任何问题,请随时提出,我会在帖子中添加。

您要求为新月形阴影拟合一个圆圈,所以我已将圆形拟合到阴影中。重要的是要意识到,在某种生产代码中,我想,必须处理大量这种性质的图像,因此有必要改进拟合的圆圈。特别是这种类型的任何类型的结构分析只是担心将给定的形状与像素相匹配,而不是担心所讨论的对象就是您要查找的对象。

我故意将错误拟合的圆圈留在了那里。我建议根据您的兴趣选择凸包、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)

我得到的输出图像是

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

如果您将参数调整得恰到好处,则可以删除一个额外的圆圈,但过滤您需要的确切圆圈取决于您。 F.e.如果您只想要顶部新月形,则要求最小的y 坐标,如果所有阴影都与这些一样大,则您只能要求半径大于某个阈值的圆等...

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      相关资源
      最近更新 更多