【学习笔记】opencv之canny算子

本文介绍了Canny边缘检测算法,该算法通过设置上下阈值来连接独立像素形成轮廓。在OpenCV中,cvCanny函数用于实现这一过程,参数包括输入输出图像、低阈值、高阈值和孔径大小。使用该函数可以有效地检测图像边缘。

        canny是边缘检测的一个算法,最重要的特点就是其将独立边的候选像素拼接成轮廓。轮廓的行程是对这些像素运用滞后性阈值,分为上下阈值,大于上限阈值则被认为是边界,小于下线阈值则被抛弃,介于两者之间时,只有当其与高于上限阈值的像素连接时才会被接受。

利用opencv时,cvCanny的形式如下:

void cvCanny( const CvArr*img,CvArr*edges,double lowTresh , double highTresh,int apertureSize = 3);

其处理的图像为单通道图像,输入输出均为单通道;

程序如下:

#include <cv.h>
#include <highgui.h>
void main()
{
IplImage *frame,*gray,*canny;
frame=cvLoadImage("test.jpg");//加载图像
gray=cvCreateImage(cvGetSize(frame),frame->depth,1);//分配图像空间
canny=cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,1);
cvNamedWindow("frame");
cvNamedWindow("gray");
cvNamedWindow("canny");
cvCvtColor(frame,gray,CV_BGR2GRAY);//转为灰度
cvCanny(gray,canny,50,100,3);
 
/*IplImage *canny8u=cvCreateImage(cvGetSize(canny),IPL_DEPTH_8U,1);
cvConvertScaleAbs(canny,canny8u,1,0);*/
cvShowImage("frame",frame);//显示图像
cvShowImage("gray",gray);
cvShowImage("canny",canny);
while(1)
if(cvWaitKey
### 关于OpenCV中霍夫圆检测的学习教程 #### 霍夫圆检测简介 霍夫圆检测是一种用于识别图像中圆形物体的技术。该方法通过参数空间累加投票的方式找到可能存在的圆心位置及其半径大小[^1]。 #### 实现过程概述 为了实现霍夫圆检测,通常遵循以下几个主要步骤: - **转换为灰度图**:对于彩色输入图片来说,第一步是要将其转化为单通道的灰度形式以便后续处理。 - **降噪预处理**:采用诸如高斯滤波的方法去除不必要的细节干扰,使得边缘更加清晰明显[^3]。 - **提取轮廓线**:利用像Canny这样的算子来进行边界捕捉操作,从而获得目标对象的大致外形特征。 - **执行Hough变换**:调用`cv2.HoughCircles()`函数完成实际的圆周定位工作;此阶段涉及设定多个重要参数以控制精度和效率之间的平衡关系。 - **可视化结果**:最后一步是在原图中标记出所发现的所有符合条件的圆形区域供进一步分析或展示用途。 下面是具体的Python代码实例来说明如何运用上述流程进行简单的霍夫圆检测任务: ```python import cv2 import numpy as np # 加载测试样本并调整尺寸方便显示 img = cv2.imread('coins.jpg') 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、付费专栏及课程。

余额充值