OpenCv:边缘处理&Canny边缘检测

卷积边缘:

一、在进行卷积的时候,对于原图像(1,1)的位置,左、上方没有足够的像素做卷积。

二、通常,在卷积之前,在原图增加边缘像素,比如(3*3的,增加一个像素)

三、增加像素值得处理方法,通常有:

(一)BORDER_DEFAULT。默认

(二)BORDER_CONSTANT。使用固定的值。

(三)BORDER_REPLICATE。使用已知边缘的像素值。

(四)BORDER_WRAP。用另一边的像素值来补偿填充。

四、API

复制代码
copyMakeBorder(
Mat src,
Mat dst,
int top,//边缘宽度,一般上下左右都一样
int bottom,
int left,
int right,
int borderType,//类型
Scalar value //颜色限制
)
复制代码

五、例子

原图

BORDER_DEFAULT

BORDER_REPLICATE

 

BORDER_WRAP

 

 


 Canny边缘检测

一、算法介绍

(一)高斯模糊——GaussianBlur。就是对图像进行降噪。

(二)灰度转换——cvtColor。

(三)计算梯度——Sobel/Scharr。得到   |X| + |Y|。

(四)非最大信号抑制。由于Sobel后,边沿非常强(粗),甚至起“皱褶”。因此要处理。

(五)高低阈值输出二值图像。

 二、详细介绍

(一)梯度。Sobel

Gx:将kernel内,水平方向的所有变化量,全部集中在【锚点】处,而且【锚点】同行,还*2,突出其权重。

G如果大于某个阈值,那么此位置就可能是边缘了。

G通常用G = |Gx| +|Gy|

(二)非最大信号抑制

  1、梯度方向。在哪个方向变化最大。

  

  θ在0~180度之间

  2、抑制。

    (1)找到θ

    (2)比如θ=90度,找到90±45度的像素(左上、右上)

    (3)如果像素值,大于左上、右上,那么保留。否则舍弃。

(三)高低阈值输出二值图像。

  1、定义2个阈值:高值T1、低值T2。

  2、大于T1,保留;小于T2,丢弃。

  3、从高于T1的像素开始寻找,大于T2且相互链接的,都保留。

  4、推荐T1:T2 = 3:1,或者2:1。

 三、API介绍

复制代码
Canny(
Mat src, //8-bit(位)的灰度图
Mat dst,
double T2, //低阈值,此值越高,得到的边缘越少,最终只留最强的边缘
double T1, //高阈值,通常为255
int aptertureSize,//Soble算子的Size,通常3*3的,所以这里填3
bool L2gradient //true表示是L2来归一化,否则用L1归一化,一般为false
)

//L2gradient ,使用L2,则用G = sqrt(gx*gx + gy* gy)来求梯度,否则用
//G = |gx| + |gy|来近似
复制代码

四、例子

Mat gaussianBlur, gray, canny;  
    cvtColor(src, gray, COLOR_BGR2GRAY);
    Canny(gray, canny, 85, 255, 3); 
    imshow("canny", canny);

随着低阈值的变化,而变化

 

posted on   耀礼士多德  阅读(211)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示