Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 霍夫圆-寻找参数_Python_Opencv_Image Processing_Hough Transform - Fatal编程技术网

Python 霍夫圆-寻找参数

Python 霍夫圆-寻找参数,python,opencv,image-processing,hough-transform,Python,Opencv,Image Processing,Hough Transform,是否有减少圆检测参数的方法为什么cv2.HoughCircles()中的参数在更改后有时不会受到影响?我有一个for循环来改变参数,但它不会一直影响结果 似乎Hough圆需要用户进行大量的参数优化,如果用户希望以非常普遍的方式使用系统,这将是一个可怕的问题。因此,我试图创建一个算法,自动为opencv的Houghcirles函数找到最佳参数。 目前,houghcirlces函数将在图像中找到圆的最大和最小半径,并对找到的圆的匹配程度设置一些阈值 我的希望是将要搜索的最小半径和最大半径分成不同的范

是否有减少圆检测参数的方法为什么
cv2.HoughCircles()
中的参数在更改后有时不会受到影响?我有一个for循环来改变参数,但它不会一直影响结果

似乎Hough圆需要用户进行大量的参数优化,如果用户希望以非常普遍的方式使用系统,这将是一个可怕的问题。因此,我试图创建一个算法,自动为opencv的Houghcirles函数找到最佳参数。 目前,houghcirlces函数将在图像中找到圆的最大和最小半径,并对找到的圆的匹配程度设置一些阈值

我的希望是将要搜索的最小半径和最大半径分成不同的范围,然后使用在每个部分中找到的圆来确定最终houghcircles变换应该使用的参数。(如果有人对此有更好的方法,我很乐意听到。)


但是我遇到了这个问题:

似乎没有遵守最小和最大半径参数,或Canny和Hough空间阈值
例如,我们可以拍摄以下图像:

并在上面运行以下代码:

import numpy as np
import cv2

file_path = '1.png'
img = cv2.imread(file_path)
gray = cv2.imread(file_path, cv2.IMREAD_GRAYSCALE)
# Begin using the largest dimesion of the image as the largest possible radius
largest_dimension = np.max([gray.shape[0], gray.shape[1]])
for i in range(1,100):
    # For the first iteration we use the largest possible radius
    if i == 1:
        maxRadius = largest_dimension
    # THe next iterations we use what the minimum radius was last iteration 
    else:
        maxRadius = minRadius
    # Reduce the size by 2 everytime
    minRadius = maxRadius/2
    dp = 1 # Inverse ratio of thresholded image resolution ?? Not sure what to do with this
    minDist = minRadius # Not likely to be much closer than the minimum radius...?
    param1 = 200 # Canny edge threshold - image OTSU threshold dependence ?? 
    param2 = 100 # Hough space threshold - radius dependance?  np.pi*maxRadius**2 ??
    circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp, minDist, param1, param2, minRadius, maxRadius)

    # Display some inforation about the results
    if circles is not None:
        img_copy = img.copy()
        radii = np.array([c[2] for c in circles[0]])
        num = len(circles[0])
        avg = np.mean(radii)
        print str(num) + ' found: avg radius: ' + str(avg)
        if any(radii < minRadius) or any(radii > maxRadius):
            print 'The minimum and maximum radii given are not being respected' 
        for c in circles[0]:
            cv2.circle(img_copy, (c[0],c[1]), c[2], (255,0,255),2)

        cv2.namedWindow('', cv2.WINDOW_NORMAL)
        cv2.imshow('',img_copy)
        cv2.waitKey(0)
将numpy导入为np
进口cv2
文件路径='1.png'
img=cv2.imread(文件路径)
gray=cv2.imread(文件路径,cv2.imread\u灰度)
#开始使用图像的最大尺寸作为可能的最大半径
最大尺寸=np.max([gray.shape[0],gray.shape[1]))
对于范围(1100)内的i:
#对于第一次迭代,我们使用可能的最大半径
如果i==1:
最大半径=最大尺寸
#在下一次迭代中,我们使用上一次迭代的最小半径
其他:
最大半径=最小半径
#每次缩小2号
最小半径=最大半径/2
dp=1#阈值图像分辨率的反比??不知道该怎么办
minDist=最小半径#不太可能比最小半径更近。。。?
param1=200#Canny边缘阈值-图像大津阈值相关性??
param2=100#Hough空间阈值-半径依赖性?np.pi*最大半径**2??
圆=cv2.霍夫圆(灰色,cv2.霍夫梯度,dp,Minist,param1,param2,minRadius,maxRadius)
#显示一些关于结果的信息
如果圆不是无:
img_copy=img.copy()
半径=np.数组([c[2]表示圆[0]]中的c)
num=len(圆圈[0])
平均值=平均值(半径)
打印str(num)+找到:平均半径:'+str(平均)
如果有(半径<最小半径)或任何(半径>最大半径):
打印“未遵守给定的最小和最大半径”
对于圆[0]中的c:
cv2.圈(img_copy,(c[0],c[1]),c[2],(255,0255),2)
cv2.namedWindow(“”,cv2.WINDOW_正常)
cv2.imshow(“”,img_副本)
cv2.等待键(0)
我们将得到如下所示的输出,并且每次函数都不考虑半径。此外,如果我们将param1和param2(Canny边缘检测和Hough空间阈值)从3更改为6000,几乎没有任何变化

显然,下图所示的图像检测到的圆圈比任何人通常检测到的要多得多,而且只会变得更糟

我可能会提到,我希望在将来使用此脚本的图像将显示如下:


我对参数的异常行为也有同样的问题-你有

circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp, minDist, param1, param2, minRadius, maxRadius)
但是函数签名实际上是

>>> import cv2
>>> print cv2.HoughCircles.__doc__
HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) -> circles
注意参数列表中的
圆圈

我从某个地方复制了一些代码,其中明确地命名了剩余的参数,如

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0)

在某个时候,我删除了这些名字。错了

为了更准确地检测圆并消除噪声,我实际上会在将灰度图像发送到HoughCircles()方法之前对其执行canny边缘检测器。通过这样做,您可以获得更高的边缘检测阈值精度,因为您可以完全控制两个参数,而不仅仅是一个参数

Canny(src_gray, src_gray, 300, 500, 3 );
HoughCircles( src_gray, circles, CV_HOUGH_GRADIENT, 1, image.rows/2, 30, 30, 40, 1000 );

使用canny()方法的参数,特别是300和500,为您的用例找到一个最佳点。希望这是有帮助的!祝你好运

圆的霍夫变换是一个相当“愚蠢”的算法。它会根据您的参数强制执行图像。如果不指定半径,则必须对所有半径使用蛮力,这将花费太长的时间。在前两张火焰图像中,我不假设在canny边缘后有任何圆,TBHY您可以使用canny edge detectiom,在hough中选择上thres=param,下thres=param/2,以查看将搜索哪些图像圆。我尝试使用我的param1和param1/2作为阈值运行canny,即使我将值设为2000(生成黑色图像),我仍然从Houghcircs获得完全相同的输出。看起来只有最小-最大半径参数改变了什么,但它们仍然不能正常工作。是的,在Canny工作之前,我需要对其中一些图像进行一些处理步骤,但这也是我把它们放在那里的一个原因,以防有人提出建议,比如沃罗尼或分水岭,或者在Canny之前我不知道要使用的东西。我使用HoughCircles使用5MP摄像头检测金属件上的孔,并添加Canny,因为预处理根本没有帮助!通过调整dp参数,我得到了一些改进的结果。。。