霍夫找圆 opencv-python

送上一篇初学open cv霍夫找圆,识别率低下,自娱自乐。

 

pyrMeanShiftFiltering这个函数严格来说并不是图像的分割,而是图像在色彩层面的平滑滤波,它可以中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的颜色区域

 

第一个参数src,输入图像,8位,三通道的彩色图像,并不要求必须是RGB格式,HSV、YUV等Opencv中的彩色图像格式均可;

第二个参数dst,输出图像,跟输入src有同样的大小和数据格式;(自带参数好复杂,我直接用参数的方式将图像传出

第三个参数sp,定义的漂移物理空间半径大小;

第四个参数sr,定义的漂移色彩空间半径大小;

第五个参数maxLevel,定义金字塔的最大层数;

第六个参数termcrit,定义的漂移迭代终止条件,可以设置为迭代次数满足终止,迭代目标与中心点偏差满足终止,或者两者的结合;

o(* ̄︶ ̄*)o很好,以上的黑色参数我全都用不到,涉及到源文件,漂移最大的半径以及平滑程度,你就理解为模糊程度吧

模糊程度相当的决定了识别率哈,真的是,改了10分钟的模糊度才最终找圆成功。后面的代码灰度图的转化,在上一周的单通道灰度形成对比cimage = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)。主要是为了再多通道中(你可以理解为在彩色图片中增加识别率二转化为黑白的图片)应为cv3推出了通道自定义,没搞懂,返回来使用cv2。

 

 

我大概模糊到这个程度就成功识别圆了。下面步入正题,霍夫函数的理解:

cv2.HoughCircles(image,method,dp,minDist[, circles[,param1, param2[,minRadius[,maxRadius]]]]])

image 不用多说,输入矩阵

method cv2.HOUGH_GRADIENT 也就是霍夫圆检测,梯度法

dp 计数器的分辨率图像像素分辨率与参数空间分辨率的比值(官方文档上写的是图像分辨率与累加器分辨率的比值,它把参数空间认为是一个累加器,毕竟里面存储的都是经过的像素点的数量),dp=1,则参数空间与图像像素空间(分辨率)一样大,dp=2,参数空间的分辨率只有像素空间的一半大(楼主理解不到)

minDist 圆心之间最小距离,如果距离太小,会产生很多相交的圆,如果距离太大,则会漏掉正确的圆

param1 canny检测的双阈值中的高阈值,低阈值是它的一半

param2 最小投票数(基于圆心的投票数)

minRadius 需要检测圆的最小半径

maxRadius 需要检测圆的最大半径

 

 for i in circles[0]:

        cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)#画圆

        cv.circle(image, (i[0], i[1]), 2, (255, 0, 255), 2)#画圆心

在这儿我遍历了前面find方法找到的所有的圆形,分别画出他们的圆的边缘线和圆心,(i[0], i[1])指的是坐标行列,i[2]存放的是半径,2为内径圆的半径,用来表示圆心。

import cv2 as cv

import numpy as np

#圆检测

def circles_find(image):

    dst = cv.pyrMeanShiftFiltering(image, 10, 200)

    cimage = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)#灰度转换哈

    cv.imshow("show",cimage)

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

    circles = np.uint16(np.around(circles))

    for i in circles[0]:

        cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)#画圆

        cv.circle(image, (i[0], i[1]), 5, (255, 0, 255), 2)#画圆心

    cv.imshow("circle", image)





src = cv.imread("find5.jpg")

cv.imshow("cicle", src)

circles_find(src)

cv.waitKey(0)

cv.destroyAllWindows()

 

在这儿贴上代码吧,后面尝试了两个没怎么用过的函数,试一试。

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值