用openCV和python进行目标检测

2024-09-27 09:23:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

enter image description here

我尝试使用函数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()

Tags: importimgifnpsysfilenamecv2else
3条回答

使用合适的阈值技术将图像转换为二进制图像(Otsu可能会有所帮助)。然后使用形态学操作,如腐蚀,使圆圈变小,然后你可以很容易地找到他们的中心。在

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

enter image description here

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

为了有效地抑制h-dome变换后输入边界附近的噪声,在上述代码中进行了高斯滤波。在

接下来是高斯滤波后的简单阈值结果(Binarize[GaussianFilter[f, 2], 0.5]),以及使用Kapur阈值化方法直接二值化得到的另一个结果(见论文“利用直方图熵进行灰度图像阈值化的新方法”(这不再是一种新方法,它来自1985年)):

enter image description hereenter image description here

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

我认为中值滤波可以改善你的形象。试着用一些3x3或7x7的内核做实验。然后,一些(局部)阈值算法将得到你的形状。你可以选择HoughCircles,也可以找到轮廓并检查其圆度。在

相关问题 更多 >

    热门问题