opencv之霍夫变换:圆

一、霍夫变换简介

经典的霍夫变换用于识别图像中的线条,但后来霍夫变换被扩展到识别任意形状的位置,最常见的是圆或椭圆。
“在许多情况下,边缘检测器可以用作预处理阶段,以获得图像空间中所需曲线上的图像点或图像像素。然而,由于图像数据或边缘检测器中的缺陷,所需曲线可能存在缺失点或像素,以及理想线/圆/椭圆与噪声边缘点之间的空间偏差从边缘检测器获得。出于这些原因,将提取的边缘特征分组为一组适当的线、圆或椭圆通常是非常重要的。霍夫变换的目的是通过对一组参数化图像对象执行显式投票过程,从而可以将边缘点分组为对象候选来解决这个问题。“—维基-霍夫变换

二、霍夫变换参数化

圆可以用三个参数完全定义:中心坐标(A,b)和半径(R):

x = a + Rcosθ
y = b + Rsinθ

当θ从0到360变化时,将创建一个半径为R的完整圆。
因此,使用Circle Hough变换,我们希望从图像中找到(x,y,R)的三元组。换句话说,我们的目的是找到这三个参数。
因此,我们需要为霍夫变换构造一个3D累加器,这将是非常无效的。因此,OpenCV使用了更复杂的方法,即使用边缘梯度信息的霍夫梯度方法。

三、霍夫变换源码

我们在这里使用的函数是cv2.HoughCircles()。它有很多论点,在文档中有很好的解释。所以我们直接进入代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt

bgr_img = cv2.imread('hg.jpg') # read as it is

if bgr_img.shape[-1] == 3:           # color image
    b,g,r = cv2.split(bgr_img)       # get b,g,r
    rgb_img = cv2.merge([r,g,b])     # switch it to rgb
    gray_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2GRAY)
else:
    gray_img = bgr_img

img = cv2.medianBlur(gray_img, 5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

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

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

for i in circles[0,:]:
    # draw the outer circle
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
    # draw the center of the circle
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)

plt.subplot(121),plt.imshow(rgb_img)
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(cimg)
plt.title('Hough Transform'), plt.xticks([]), plt.yticks([])
plt.show()

四、案例分析:

4.1 虚假圆圈

到现在为止,效果一直都还不错:

1
2
3

4.2 以下情况,圆不应被视为隐藏圆

在这里插入图片描述
5

4.3 通过模糊更多的内容使效果更好

img = cv2.medianBlur(gray_img, 25);

6

4.4 预处理至关重要

一般来说,在没有模糊的情况下,算法往往会提取太多的圆形特征。因此,为了更成功,预处理似乎至关重要:
7

4.5 设置更合适的模糊值

使用模糊值51:

img = cv2.medianBlur(gray_img, 51);

8

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积步千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值