霍夫圆转换为圆形阴影

Sam*_*Sam 5 python geometry opencv 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()
Run Code Online (Sandbox Code Playgroud)

lje*_*ibo 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)
Run Code Online (Sandbox Code Playgroud)

我得到的输出图像是

在此输入图像描述

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

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