java 图像梯度检测_[OpenCV学习日记-java]-10-Canny边缘检测

Canny边缘检测

Canny边缘检测算法是一种对噪声比较敏感的边缘检测算法

所以通常使用Canny检测之前,收先对图像进行降噪

一个完整的Canny边缘检测有以下几个步骤组成

高斯模糊:完成噪声抑制

灰度转换:在灰度图像上计算梯度值

计算梯度:使用Sobel/Scharr

非最大信号抑制:在梯度图像上寻找局部最大轮廓

高低阈值连接:吧边缘像素连接为线段,形成完整边缘轮廓

Canny边缘检测是函数

Canny(Mat image, Mat edges, double threshold1, double threshold2, int apertureSize, boolean L2gradient)

image:输入图像

edges:输出的二值边缘图像

threshold1:最低阈值T1

threshold2:最高阈值T2

apertureSize:用于内部计算梯度的ksize值

L2gradient:计算图像梯度计算方法

下面通过代码演示

Mat m1 = Imgcodecs.imread("C:\\test\\256_256_t1.png" );

Mat s1 = new Mat();

Imgproc.Canny(m1,s1,50,150,3,true)

HighGui.imshow("Canny",s1);

6858920bc18422cbd58f2c62f76ec584.png

不同方向的Canny边缘检测

OpenCV支持从两个已经计算出来的X方向梯度和Y方向梯度,来检测边缘

他的Api如下

Canny(Mat dx, Mat dy, Mat edges, double threshold1, double threshold2)

dx:X方向的梯度图像

dy:Y方向的梯度图像

edges :输出的二值边缘图像

threshold1:最低阈值T1

threshold2:最高阈值T2

这里需要注意的是 这里的dx个dy图像深度 必须是CV_16S

Mat m1 = Imgcodecs.imread("C:\\test\\256_256_t1.png" );

HighGui.imshow("原图",m1);

Mat s1 = new Mat();

Imgproc.Sobel(m1,s1, CvType.CV_16S,1,0);

Mat s2 = new Mat();

Imgproc.Sobel(m1,s2, CvType.CV_16S,0,1);

Mat s3 = new Mat();

Imgproc.Canny(s1,s2,s3,50,150);

//为了展示s1和s2 转换深度

Core.convertScaleAbs(s1,s1);

Core.convertScaleAbs(s2,s2);

HighGui.imshow("X方向梯度",s1);

HighGui.imshow("Y方向梯度",s2);

HighGui.imshow("Canny边缘检测",s3);

401d4f50ef5cc4d72471a5e00336ac8b.png

本来这里应使用灰度图,但是忘了…

最好是使用灰度图像进行计算,这样计算量会比较小

85b51b0e49575630dd8ad263e6a9a487.png

7443628b0808bf41c06574ee61e91166.png

Timeless小帅

发布了35 篇原创文章 · 获赞 33 · 访问量 2万+

私信

关注

标签:10,java,Mat,边缘,梯度,s1,OpenCV,图像,Canny

来源: https://blog.csdn.net/qq_18604209/article/details/104075617

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值