首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HOUGH_GRADIENT_ALT参数的选择

HOUGH_GRADIENT_ALT参数的选择
EN

Stack Overflow用户
提问于 2022-05-09 16:59:20
回答 1查看 339关注 0票数 0

我已经试着解决这个问题好几个小时了,而且StackOverflow上的类似问题也帮不了我。

假设我有这个图像(实际上,它是一个更复杂的图像,但我现在只举一个简单的例子):

我为HOUGH_GRADIENT做了以下操作

代码语言:javascript
复制
import cv2
import numpy as np
img = cv2.cvtColor(cv2.imread("example.png"), cv2.COLOR_BGR2GRAY)
img_blur = cv2.GaussianBlur(img, (9, 9), 1.5)
edges = cv2.Canny(img_blur, threshold1=50, threshold2=250)
circles = cv2.HoughCircles(
    edges, cv2.HOUGH_GRADIENT, 1.5, 20, 
    minRadius=10, maxRadius=100, param1=100, param2=100
)
img_cp = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
if circles is not None:
    circles = np.round(circles[0, :]).astype("int")
    for (x, y, r) in circles:
        cv2.circle(img_cp, (x, y), r, (0, 255, 0), 4)

这是没有任何问题的工作,并检测内部的圈子,正如我所希望的:

我试图使用HOUGH_GRADIENT_ALT代替,因为OpenCV回购声称它工作得更好。据我所理解,大多数函数调用参数应该具有相同的含义,而不是param1param2

所以,我试着:

代码语言:javascript
复制
circles = cv2.HoughCircles(
edges, cv2.HOUGH_GRADIENT_ALT, 1.5, 20, 
minRadius=10, maxRadius=100, param1=300, param2=0.9

)

我什么也得不到。我尝试过许多不同的参数,但都没有结果。不仅我不知道如何解决它,而且我也不明白为什么它不能工作。任何帮助都将不胜感激。

OpenCV版本4.5.5。

EN

回答 1

Stack Overflow用户

发布于 2022-05-10 09:17:14

我解决了问题。试一试:编辑:我们不能使用这个cv2.HOUGH_GRADIENT_ALT

代码语言:javascript
复制
#!/usr/bin/python39
#OpenCV 4.5.5 Raspberry Pi 3/B/4B-w/4/8GB RAM, Bullseye,v11.
#Date: 10th May, 2022

import numpy as np
import cv2

img = cv2.imread('circle.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
bilateral = cv2.bilateralFilter(gray,10,50,50)

minDist = 30
param1 = 30
param2 = 30
minRadius = 5
maxRadius = 100

circles = cv2.HoughCircles(bilateral, cv2.HOUGH_GRADIENT, 1, minDist, param1=param1, param2=param2, minRadius=minRadius, maxRadius=maxRadius)

if circles is not None:
    circles = np.uint16(np.around(circles))
    for i in circles[0,:]:
        cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 4)

cv2.imwrite('inner_circle.png', img)
# Show result for testing:
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

编辑:我们可以使用cv2.HOUGH_GRADINT_ALT并使用@Valeria中的代码片段。

代码语言:javascript
复制
import numpy as np
import cv2


img = cv2.imread('circle.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
bilateral = cv2.bilateralFilter(gray,10,50,50)       

#circles = cv2.HoughCircles(bilateral, cv2.HOUGH_GRADIENT_ALT, 1, minDist, param1=param1, param2=param2, minRadius=minRadius, maxRadius=maxRadius)
circles = cv2.HoughCircles(bilateral,
                           cv2.HOUGH_GRADIENT_ALT,
                           1.5, 20,
                           minRadius=10, maxRadius=100,
                           param1=300, param2=0.9)

if circles is not None:
    circles = np.uint16(np.around(circles))
    for i in circles[0,:]:
        cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 4)

cv2.imwrite('inner_circle1.png', img)
# Show result for testing:
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72175685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档