霍夫圆变换为圆形阴影
Hough circle transform to circular shadow
我有一张图像,我在其中尝试将霍夫圆变换应用于视图中的圆形对象。
我很难找到适合圆柱体外阴影的圆。可以做些什么来正确分割这个阴影并轻松地为它拟合一个圆圈?
代码:
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()
您要分割的阴影是迄今为止最暗的区域。我会使用一个阈值来过滤掉所有更亮的像素。如果仍然存在噪声,我会使用连通分量来找到最大的 "blob"。一旦阴影是唯一剩下的东西并且所有其他像素都设置为 0,我会尝试上面 dhanushka 推荐的 minEnclosingCircle。
我只是写出代码而不是通过它,因为有很多功能,我不想假设你知道或不知道的东西并花很长时间来写.如果您有 任何 问题,请随时提出,我会将其添加到 post。
您要求在新月形阴影处画一个圆圈,所以我在阴影处画了圆圈。重要的是要认识到,在某种生产代码中,我想,必须处理大量这种性质的图像,因此有必要细化拟合的圆圈。特别是这种类型的任何类型的结构分析都只是担心给定的形状适合像素,而不是所讨论的对象就是你要找的东西。
我故意将错误安装的圆圈留在那里。我建议使用 convexHull、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
坐标,如果所有的阴影都和这些一样大,你可以只要求半径大于某个阈值的圆等...
我有一张图像,我在其中尝试将霍夫圆变换应用于视图中的圆形对象。
我很难找到适合圆柱体外阴影的圆。可以做些什么来正确分割这个阴影并轻松地为它拟合一个圆圈?
代码:
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()
您要分割的阴影是迄今为止最暗的区域。我会使用一个阈值来过滤掉所有更亮的像素。如果仍然存在噪声,我会使用连通分量来找到最大的 "blob"。一旦阴影是唯一剩下的东西并且所有其他像素都设置为 0,我会尝试上面 dhanushka 推荐的 minEnclosingCircle。
我只是写出代码而不是通过它,因为有很多功能,我不想假设你知道或不知道的东西并花很长时间来写.如果您有 任何 问题,请随时提出,我会将其添加到 post。
您要求在新月形阴影处画一个圆圈,所以我在阴影处画了圆圈。重要的是要认识到,在某种生产代码中,我想,必须处理大量这种性质的图像,因此有必要细化拟合的圆圈。特别是这种类型的任何类型的结构分析都只是担心给定的形状适合像素,而不是所讨论的对象就是你要找的东西。
我故意将错误安装的圆圈留在那里。我建议使用 convexHull、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
坐标,如果所有的阴影都和这些一样大,你可以只要求半径大于某个阈值的圆等...