Opencv2系列学习笔记9(使用Canny算子检测轮廓)

本文介绍了Canny算子在边缘检测中的优势,它通过双阀值策略解决边缘检测中过粗和阀值选择的问题。文章提供了OpenCV和Matlab中实现Canny算子的代码示例,并解释了相关参数,如阈值和高斯滤波器的标准差。对比Sobel算子和拉普拉斯变换,Canny算子能获得更优的边缘检测结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面我们用sobel算子和拉普拉斯变换也可以进行边缘检测,见我的上一篇blog:

http://blog.youkuaiyun.com/lu597203933/article/details/17252285

但这样得到的二值边缘图像有两大缺点。第一:检测到的边缘过粗,这意味着难以实现物体的精确定位。第二:难以找到这样的阀值,即能足够低检测到所有重要的边缘,同时也不至于包含过多次要的边缘。

这个正是canny算子要解决的。

Canny算子通常基于sobel算子,有两个阀值,这样可以得到两幅边缘图;canny算法组合这两幅边缘图以生成一副“最优”的轮廓图。如果存在连续的边缘点,则将低阀值图像中的边缘点与高阀值图像中的边缘相连接,那么就保留低阀值图像中的边缘点。这种使用双阀值以得到二值图像的策略被称为磁滞阀值化。

代码:

int main()
{
	Mat image = imread("F:\\lena.png", 0);    // 这里也可以是BGR 但是想想提取轮廓 效果是一样的
	if(!image.data)
	{
		cout << "Fail to load image" << endl;
		return 0;
	}
	Mat result;
	Canny(image, result, 150, 220);
	namedWindow("cannyResult");
	imshow("cannyResult", result);
	waitKey(0);
	return 
### 关于OpenCV中霍夫圆检测的学习教程 #### 霍夫圆检测简介 霍夫圆检测是一种用于识别图像中圆形物体的技术。该方法通过参数空间累加投票的方式找到可能存在的圆心位置及其半径大小[^1]。 #### 实现过程概述 为了实现霍夫圆检测,通常遵循以下几个主要步骤: - **转换为灰度图**:对于彩色输入图片来说,第一步是要将其转化为单通道的灰度形式以便后续处理。 - **降噪预处理**:采用诸如高斯滤波的方法去除不必要的细节干扰,使得边缘更加清晰明显[^3]。 - **提取轮廓线**:利用像Canny这样的算子来进行边界捕捉操作,从而获得目标对象的大致外形特征。 - **执行Hough变换**:调用`cv2.HoughCircles()`函数完成实际的圆周定位工作;此阶段涉及设定多个重要参数以控制精度和效率之间的平衡关系。 - **可视化结果**:最后一步是在原图中标记出所发现的所有符合条件的圆形区域供进一步分析或展示用途。 下面是具体的Python代码实例来说明如何运用上述流程进行简单的霍夫圆检测任务: ```python import cv2 import numpy as np # 加载测试样本并调整尺寸方便显示 img = cv2.imread(&#39;coins.jpg&#39;) output = img.copy() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 应用轻微模糊效果降低随机噪声影响 blurred = cv2.GaussianBlur(gray, (9, 9), 2) # 执行边缘探测算法得到初步形状线索 edges = cv2.Canny(blurred, threshold1=50, threshold2=150) # 进行霍夫变换查找潜在的圆形结构 circles = cv2.HoughCircles(edges, method=cv2.HOUGH_GRADIENT_ALT, dp=1.5, minDist=80, param1=400, param2=0.85, minRadius=20, maxRadius=100) if circles is not None: detected_circles = np.uint16(np.around(circles)) for circle in detected_circles[0]: center_x, center_y, radius = circle # 绘制外接矩形框包围每一个被确认下来的圈状物 cv2.circle(output, (center_x, center_y), radius, color=(0, 255, 0), thickness=2) # 同时也标记中心点坐标作为辅助参考信息 cv2.circle(output, (center_x, center_y), 2, color=(0, 0, 255), thickness=-1) # 展示最终成果给用户查看 cv2.imshow("Detected Circles", output) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段脚本展示了完整的从读取文件直至渲染图形输出整个链条上的各个环节,并且包含了必要的配置选项让读者能够轻松复制运行起来观察具体行为表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值