Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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
使用openCV和python检测对象_Python_Image Processing_Opencv_Object Detection - Fatal编程技术网

使用openCV和python检测对象

使用openCV和python检测对象,python,image-processing,opencv,object-detection,Python,Image Processing,Opencv,Object Detection,我正在尝试使用OpenCV和Python检测下图中的白点 我尝试使用函数cv2.HoughCircles,但没有成功 我需要使用不同的方法吗 这是我的代码: import cv2, cv import numpy as np import sys if len(sys.argv)>1: filename = sys.argv[1] else: filename = 'p.png' img_gray = cv2.imread(filename,cv2.CV_LOAD_I

我正在尝试使用OpenCV和Python检测下图中的白点

我尝试使用函数cv2.HoughCircles,但没有成功

我需要使用不同的方法吗

这是我的代码:

import cv2, cv
import numpy as np
import sys

if len(sys.argv)>1:
    filename = sys.argv[1]
else:
    filename = 'p.png'

img_gray = cv2.imread(filename,cv2.CV_LOAD_IMAGE_GRAYSCALE)

if img_gray==None:
    print "cannot open ",filename

else:
    img = cv2.GaussianBlur(img_gray, (0,0), 2)
    cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
    circles = cv2.HoughCircles(img,cv2.cv.CV_HOUGH_GRADIENT,4,10,param1=200,param2=100,minRadius=3,maxRadius=100)
if circles:
    circles = np.uint16(np.around(circles))
    for i in circles[0,:]:
        cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),1) 
        cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)   

cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

我认为中值滤波器会改善你的图像。尝试使用一些内核,3x3或7x7。然后,一些(局部)阈值算法将得到你的形状。您可以选择HoughCircles,也可以仅查找轮廓并检查其圆度。

使用合适的阈值技术将图像转换为二值图像(大津可能会有所帮助)。然后使用形态学操作(如腐蚀)使圆变小,然后您可以轻松找到圆的中心。

如果您可以在OpenCV中复制形态学重建,则可以轻松构建h-dome变换,从而大大简化任务。否则,一个简单的高斯滤波阈值就足够了

Binarize[FillingTransform[GaussianFilter[f,2],0.4,Padding->1]

在上面的代码中进行了高斯滤波,以有效地抑制输入边界周围的噪声,否则在h-dome变换后仍将保留该噪声

接下来是高斯滤波后的简单阈值结果(
二值化[GaussianFilter[f,2],0.5]
),以及通过使用Kapur阈值化方法直接二值化给出的另一个结果(参见“利用直方图熵的灰度图像阈值化新方法”一文)(这不再是一种新方法,而是从1985年开始):


上面的右图边界上有很多小点(在这个图像分辨率下看不到),但它是全自动的。从这三个选项中,只有第二个选项已经出现在OpenCV中。

图像的边界周围有很多白点。你能澄清你想找到哪些点吗?也许那些靠近中心的点根本不是点?大津将给出一个非常糟糕的结果,你可以自己测试,或者至少是t查看图像的直方图(提示:它是单峰的).是的,也许你是对的。我以前做过类似的事情,但我不记得我用过哪种二值化,不管是kittler还是otsu。我不是要你相信我,你自己试试。在otsu进行二值化后,你会看到结果。但是Kapur的方法工作得很好,那时不需要形态学运算。