耕的左边读什么| 出圈是什么意思| 兔子是什么意思| hvb是什么意思| 冬菜是什么菜| 蛇最怕什么药| 撇清关系是什么意思| 前列腺钙化斑是什么意思| 格林巴利综合症是什么| 长期吃阿司匹林有什么副作用| 新疆是什么民族| 牙齿突然酸痛什么原因| 肚脐眼上面痛是什么原因引起的| 爱上一个人是什么感觉| 经常拉肚子什么原因| 氨纶是什么| 月黑风高什么意思| 211是什么星座| 什么是朋友| 脚气脱皮用什么药最好| 梦见孩子拉粑粑是什么意思| 什么是性冷淡| 蔬菜有什么| 房速与房颤有什么区别| bpd是胎儿的什么| 为什么会得疣| 是什么时候| 陈皮和橘子皮有什么区别| 连铁是什么器官| 华妃娘娘是什么电视剧| hpv81低危型阳性是什么意思| 炒鱿鱼是什么意思| 记录是什么意思| 什么什么不什么| 上焦火吃什么药最有效| 新生儿眼屎多是什么原因| 嘴角起泡是什么原因| 太平天国失败的根本原因是什么| 意念是什么| 9月10日是什么日子| 吃什么药可以延长射精| 连续放屁是什么原因呢| 右眼跳是什么意思| 一月四号是什么星座| 濯清涟而不妖的濯是什么意思| 吃红枣有什么好处| 后生是什么意思| 病字旁加且念什么| 黄体破裂是什么原因造成的| 肉桂属于什么茶| 白带拉丝是什么原因| icu是什么意思| 目瞪口呆是什么生肖| 共建是什么意思| 什么的足球| 红色和什么颜色搭配好看| 第一磨牙什么时候换| 哺乳期吃辣椒对宝宝有什么影响| 麦霸什么意思| 节令是什么意思| 四肢厥逆是什么意思| 小米性寒为什么养胃| 常温保存是什么意思| jeep衣服什么档次| 帕金森吃什么药效果好| 鼻塞一直不好什么原因| 孩子嗓子有痰吃什么药| 睡莲什么时候开花| 什么人一年只工作一天脑筋急转弯| 下身痒是什么原因| 小排畸主要检查什么| 经常跑步对身体有什么好处| 吃了安宫牛黄丸要禁忌什么不能吃| 生粉和淀粉有什么区别| 副高是什么意思| 厚黑学的精髓是什么| 字母圈是什么意思| 可喜可贺是什么意思| 乙酸是什么| 泰迪哼哼唧唧表示什么| 大连机场叫什么| 卤什么东西好吃| 条件致病菌是什么意思| 健康证需要什么材料| 为什么脚会脱皮| 诗经又称什么| 鸡宝是什么| 出家人不打诳语是什么意思| 孩子睡觉咬牙齿是什么原因引起的| 经期吃什么| 近义词是什么意思| 非户籍是什么意思| 补血吃什么水果| 抓龙筋什么意思| 白带是什么颜色的| 小孩吃什么通便降火| 牛郎是什么职业| 湿气重有什么表现症状| 为什么叫a股| 忠武路演员是什么意思| 乙状结肠冗长是什么意思| 拿的起放的下是什么意思| ed是什么| 劫数是什么意思| 痛经是什么感觉| 果脯是什么| 尿黄什么原因| 五行属性是什么| 女人肝火旺吃什么好| 68岁属什么生肖| 7月7是什么节日| 女生肚脐眼下面疼是什么原因| 为什么会近视| 梦见捡硬币是什么预兆| 拔罐有什么用| 全身酸痛失眠什么原因| 腕管综合征吃什么药| 手串19颗代表什么意思| 白质脱髓鞘是什么病| 冉字五行属什么| 属羊的和什么属相不合| 什么是横纹肌肉瘤| 康复治疗是做什么的| 生物冰袋里面是什么| 婴儿流口水是什么原因引起的| 体脂是什么| 尿多尿频是什么原因造成的| 余光是什么意思| 皮肤病用什么药膏好| 丝状疣用什么药膏最好| 座是什么结构| 吃什么水果对肺好| 重金属是什么| 懿字五行属什么| 尿道感染流脓吃什么药| 非洲讲什么语言| 红色象征什么| 夏至未至是什么意思| 毛骨鱼是什么鱼| 牙出血什么原因| 总做噩梦是什么原因| 肾水不足是什么意思| 沉默寡言是什么意思| 喉咙疼吃什么| 咳嗽绿痰是什么原因| 什么样的大便是正常的| 炎症是什么病| 乳腺看什么科室| 鬼最怕什么东西| 倭瓜是什么意思| 令坦是对方什么人的尊称| 什么是化学阉割| 血亏什么意思| 宫颈出血是什么症状| mg什么单位| 黑加京念什么| 什么是sp| 一树梨花压海棠什么意思| 检查胸部应该挂什么科| 防晒隔离什么牌子好| 脑供血不足吃点什么药| 你要做什么| 88年五行属什么| 甲沟炎应该挂什么科| 什么的小学生| 钼靶检查是什么意思| 吃什么水果对心脏好| 什么的威尼斯| 为什么很困却睡不着| 一路向北是什么意思| 乳腺囊性增生是什么意思| 大肠在人体什么位置图| 黄花菜都凉了什么意思| 属兔五行属什么| 梦见陌生人死了是什么意思| 左手中指戴戒指什么意思| 鱼香肉丝属于什么菜系| 休克疗法是什么意思| 嘴唇变厚是什么原因| 血清肌酐高说明什么问题| 不是省油的灯是什么意思| 呃逆吃什么药| 桂圆和红枣泡水喝有什么好处| 糜烂性胃炎吃什么药好| 火奥念什么| 过敏应该挂什么科| bml是什么意思| 六月十九是什么星座| 淋巴结清扫是什么意思| 肺大泡用什么药| 羽字五行属什么| 甲状腺结节不能吃什么东西| 深圳市市长什么级别| p.a.是什么意思| 频发房性早搏是什么意思| 什么是浸润性乳腺癌| 徐五行属什么| 排卵期有什么| 外公的妹妹叫什么| 股藓要用什么药膏效果最好| 补中益气丸适合什么人吃| 白瓜是什么瓜| 梦见打死黄鼠狼是什么意思| 腿水肿是什么原因引起的| 刘备是一个什么样的人| 身体有异味是什么原因| 足癣用什么药| 胸胀是什么原因| 反应迟钝是什么原因造成的| 后背疼吃什么药| 今天吃什么菜| 动不动就出汗是什么原因| 梦到涨大水预示着什么| 赵构为什么杀岳飞| 生辰八字是指什么| 零和游戏是什么意思| barry是什么意思| 4月13号是什么星座| 当今社会做什么赚钱| 梦到熊是什么意思| 双卵巢是什么意思| 日本人为什么喜欢喝冰水| 事业编制是什么意思| 卡地亚蓝气球什么档次| 朗格手表什么档次| 数是什么意思| 舌头尖发麻是什么原因| 肝囊肿是什么病| 韭黄和韭菜有什么区别| 疱疹什么症状| 一帘幽梦是什么意思| 什么是roi| 流理台是什么| 新是什么意思| 莓茶是什么茶| 便黑色大便是什么情况| 不停的出汗是什么原因| 女人吃什么最好| 毒鸡汤是什么意思| 肾阴虚吃什么中成药| 三四月份是什么星座| 者是什么意思| sk是什么意思| 属蛇男和什么属相最配| 龙飞凤舞是什么意思| 小孩便秘有什么办法| 28岁属什么| 眉毛淡的女人代表什么| 作价是什么意思| 端午节都吃什么菜好| 阴唇内侧长疙瘩是什么原因| 夹不住尿是什么原因| 高血糖什么原因引起| 什么食物对心脏有好处| 感冒吃什么食物好| cp感什么意思| 桥本甲状腺炎吃什么药| 做梦相亲是什么意思| 伤风感冒吃什么药| 梦到下雪是什么意思| 海螺吃什么食物| 翠色什么流| 21年是什么生肖年| 沙门氏菌用什么药最好| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 企业专区 ? OpenVINO生态社区 ? 【原创】OpenCV-Python系列之霍夫圆变换(四十一)

共1条 1/1 1 跳转至

【原创】OpenCV-Python系列之霍夫圆变换(四十一)

高工
2025-08-04 21:42:25     打赏
百度 责编:张霓、李连环

OpenCV-Python系列之霍夫圆变换

上个教程我们讨论了霍夫线变换,这次我们来看看霍夫圆变换。

原理

霍夫圆变换和霍夫线变换的原理类似。霍夫线变换是两个参数(r,θ),霍夫圆需要三个参数,圆心的x,y坐标和圆的半径.如下对应的三个参数c1,c2,c3

image.png

例如:

image.png

其形状和:

image.png

类似,该函数是由z=x沿z轴旋转而成的圆锥曲面。

对于xy平面的一个点x0,y0(上述对应的点为(1,1)),则对应的由c1,c2,c3组成三维空间的空间曲面。对于c1,c2,c3平面的一个点,则对应的在xy平面它是一个圆。

对于在x,y平面上的三个点(x0,y0)(x1,y1)(x2,y2),在c1,c2,c3三维空间是对应的三个空间曲面(此时c1,c2,c3相当于常量)。

image.png

求解这三个方程,我们可以得到c1,c2,c3的值。这说明(x0,y0)(x1,y1)(x2,y2)这三个点在由c1,c2,c3所确定的圆上(即c1,c2,c3分别表示圆的圆心x坐标、圆心y坐标以及圆的半径),且三个点对应由c1,c2,c3确定的空间的三个空间曲面。进一步说明,在xy平面,三个点在同一个圆上,则它们对应的空间曲面相交于一点(即点(c1,c2,c3))

故我们如果知道一个边界上的点的数目,足够多,且这些点与之对应的空间曲面相交于一点。则这些点构成的边界,就接近一个圆形。

上述描述的是标准霍夫圆变换的原理,由于三维空间的计算量大大增大的原因, 标准霍夫圆变化很难被应用到实际中。

OpenCV实现的是一个比标准霍夫圆变换更为灵活的检测方法: 霍夫梯度法, 也叫2-1霍夫变换(21HT),

它的原理依据是圆心一定是在圆上的每个点的模向量上, 这些圆上点模向量的交点就是圆心, 霍夫梯度法的第一步就是找到这些圆心, (圆心包含了圆心处的xy坐标)这样三维的累加平面就又转化为二维累加平面. 第二步根据所有候选中心的边缘非0像素对其的支持程度来确定半径。

OpenCV中的cv2.HoughCircles()函数实现了圆形检测,它使用的算法也是改进的霍夫变换——2-1霍夫变换(21HT)。也就是把霍夫变换分为两个阶段,从而减小了霍夫空间的维数。第一阶段用于检测圆心,第二阶段从圆心推导出圆半径。检测圆心的原理是圆心是它所在圆周所有法线的交汇处,因此只要找到这个交点,即可确定圆心,该方法所用的霍夫空间与图像空间的性质相同,因此它仅仅是二维空间。检测圆半径的方法是从圆心到圆周上的任意一点的距离(即半径)是相同,只要确定一个阈值,只要相同距离的数量大于该阈值,我们就认为该距离就是该圆心所对应的圆半径,该方法只需要计算半径直方图,不使用霍夫空间。圆心和圆半径都得到了,那么通过公式1一个圆形就得到了。从上面的分析可以看出,2-1霍夫变换把标准霍夫变换的三维霍夫空间缩小为二维霍夫空间,因此无论在内存的使用上还是在运行效率上,2-1霍夫变换都远远优于标准霍夫变换。但该算法有一个不足之处就是由于圆半径的检测完全取决于圆心的检测,因此如果圆心检测出现偏差,那么圆半径的检测肯定也是错误的。

2-1霍夫变换的具体步骤为:

1)首先对图像进行边缘检测,调用OpenCV自带的Canny()函数,将图像二值化,得到边缘图像。

2)对边缘图像上的每一个非零点。采用Sobel()函数,计算x方向导数和y方向的导数,从而得到梯度。从边缘点,沿着梯度和梯度的反方向,对参数指定的min_radiusmax_radium的每一个像素,在累加器中被累加。同时记下边缘图像中每一个非0点的位置。

3)从(二维)累加器中这些点中选择候选中心。这些中心都大于给定的阈值和其相邻的四个邻域点的累加值。

4)对于这些候选中心按照累加值降序排序,以便于最支持的像素的中心首次出现。

5)对于每一个中心,考虑到所有的非0像素(非0,梯度不为0),这些像素按照与其中心的距离排序,从最大支持的中心的最小距离算起,选择非零像素最支持的一条半径。

6)如果一个中心受到边缘图像非0像素的充分支持,并且到前期被选择的中心有足够的距离。则将圆心和半径压入到序列中,得以保留。

我们先来看OpenCV中的函数API

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

image:输入图像 (灰度图)

method:指定检测方法. 现在OpenCV中只有霍夫梯度法;

dp:累加器图像的反比分辨=1即可默认;

minDist = src_gray.rows/8: 检测到圆心之间的最小距离,这是一个经验值。这个大了,那么多个圆就是被认为一个圆;

param_1 = 200: Canny边缘函数的高阈值;

param_2 = 100: 圆心检测阈值.根据你的图像中的圆大小设置,当这张图片中的圆越小,那么此值就设置应该被设置越小。当设置的越小,那么检测出的圆越多,在检测较大的圆时则会产生很多噪声。所以要根据检测圆的大小变化;

min_radius = 0: 能检测到的最小圆半径, 默认为0

max_radius = 0: 能检测到的最大圆半径, 默认为0

我们使用图像做实验:

image.png

图像中的杂乱信息太多,我们必须先进行滤波,如果不进行滤波的情况下,我们可以看代码:

def Houghcircle(img):
    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)
    cv2.imshow('detected circles', cimg)
    cv2.waitKey(0)

image.png

结果让人感到乱七八糟的,现在我先采用中值滤波,继而采用高斯滤波,我们来看代码:

def Houghcircle(img):
    img = cv2.medianBlur(img, 3)
    img = cv2.GaussianBlur(img,(17,19),0)
    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)
    cv2.imshow('detected circles', cimg)
    cv2.waitKey(0)

image.png

可以看到,效果良好,霍夫变换通常情况下受图片的噪声信息干扰非常大,所以通常情况下我们需要对图像进行预处理操作。


对计算机视觉感兴趣?这个社区推荐给你~

>>点击了解OpenVINO生态开发社区



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
口若悬河是什么生肖 手上长小水泡是什么原因 草莓什么时候种 降血压吃什么药 助产学是干什么的
怎么看自己五行属什么 床上为什么会有跳蚤 酮症酸中毒什么原因引起的 笑掉大牙是什么动物 什么是脑白质病变
眩晕挂号挂什么科 梦见家里着火了是什么征兆 无舌苔是什么原因 beam是什么意思 狗能吃什么水果
文胸36码是什么尺寸 脚心发热是什么原因 脾功能亢进是什么意思 低压偏高什么原因 贴膏药发热是什么原因
0r是什么意思hcv9jop2ns8r.cn 左腿发麻是什么原因hcv8jop3ns0r.cn 麻油是什么hcv8jop6ns4r.cn 经常上火是什么原因hcv9jop3ns5r.cn 晚上1点是什么时辰xjhesheng.com
大熊猫是什么科hcv7jop9ns9r.cn 空调综合征有什么症状hcv8jop1ns6r.cn 防晒霜什么牌子好hcv8jop0ns7r.cn 826是什么星座hcv8jop0ns3r.cn 储备是什么意思hcv8jop7ns3r.cn
牙齿酸痛吃什么药hcv9jop2ns3r.cn 起风疹的原因是什么引起的hcv8jop8ns4r.cn 胃出血挂什么科室hcv8jop8ns9r.cn 热伤风感冒吃什么药hcv8jop2ns2r.cn 完谷不化吃什么中成药hcv8jop7ns5r.cn
干咳嗽是什么原因hcv8jop4ns6r.cn 校草是什么意思hcv7jop9ns8r.cn cg动画是什么意思hcv7jop7ns4r.cn 转氨酶偏高吃什么药hcv8jop9ns7r.cn 70岁是什么之年hcv7jop9ns7r.cn
百度