MATLAB自带的dwt2和wavedec2函数实现基于小波变换的自适应阈值图像边缘检测

MATLAB自带的dwt2和wavedec2函数实现基于小波变换的自适应阈值图像边缘检测主要完成了以下功能:1.调用不同的小波函数对图像进行小波分解;2.求解模极大值,实现固定阈值和自适应阈值的边缘提取;3.实现了全局自适应阈值的多尺度小波边缘检测;

大家好,又见面了,我是你们的朋友全栈君。

MATLAB自带的dwt2和wavedec2函数实现基于小波变换的自适应阈值图像边缘检测

1、比较不同的小波函数对边缘提取和噪声抑制的差异

小波函数有:haar小波函数、Daubechies小波函数、Biorthogo小波函数等,可以根据实际情况调用

clc;clear all;close all;

I0 = imread('lena.png');%读取照片
I0 = rgb2gray(I0);%转换为灰度图
figure,imshow(I0);title('原图');
I= imnoise(I0,'gaussian',0.01);%添加高斯噪声,密度0.01
figure,imshow(I);title('添加噪声的图');
[cA1,cH1,cV1,cD1]=dwt2(I,'haar');%使用haar小波函数进行小波变换
figure,suptitle('haar')
subplot(2,2,1),imshow(uint8(cA1)),title('低频分量');
subplot(2,2,2),imshow(uint8(cH1)),title('水平细节分量');
subplot(2,2,3),imshow(uint8(cV1)),title('垂直细节分量');
subplot(2,2,4),imshow(uint8(cD1)),title('斜线细节分量');

不同小波函数的提取效果比较

2、计算模极大值,对比并分析固定阈值和自适应阈值的结果差异

%不同的小波函数的影响
clc;clear all;close all;

I0 = imread('D:\desktop\图像处理大作业2022\图像处理大作业2022\data\project2\lena.png');%读取照片
I0 = rgb2gray(I0);%转换为灰度图
figure,imshow(I0);title('原图');
I=I0;

[cA1,cH1,cV1,cD1]=dwt2(I,'haar');%使用haar小波函数进行小波变换
figure,suptitle('haar')
subplot(2,2,1),imshow(uint8(cA1)),title('低频分量');
subplot(2,2,2),imshow(uint8(cH1)),title('水平细节分量');
subplot(2,2,3),imshow(uint8(cV1)),title('垂直细节分量');
subplot(2,2,4),imshow(uint8(cD1)),title('对角线细节分量');

%% 计算模极大值

M1=sqrt(cH1.^2+cV1.^2);

%区分象限https://wenku.baidu.com/view/f26f270b0b4c2e3f572763a8?aggId=2eb61e4487c24028915fc3b7
for i=1:size(cV1,1)
    for j=1:size(cV1,2)
        if cV1(i,j)>0&&cH1(i,j)>0%1象限
            A1(i,j)=atan(cV1(i,j)./cH1(i,j));
        end
        if cV1(i,j)<0&&cH1(i,j)>0%2象限
            A1(i,j)=atan(cV1(i,j)./cH1(i,j))-pi;
        end
        if cV1(i,j)<0&&cH1(i,j)<0%3象限
            A1(i,j)=atan(cV1(i,j)./cH1(i,j))+pi;
        end
        if cV1(i,j)>0&&cH1(i,j)<0%4象限
            A1(i,j)=atan(cV1(i,j)./cH1(i,j));
        end
    end
end
A1=A1*180/pi;
%如需后续代码请加qq有偿(¥10)获取2126705615

手动阈值与自适应阈值比较

3、基于自适应阈值实现多尺度边缘检测

matlab自带的wavedec2函数可以实现多尺度边缘检测,如果边缘提取以后噪点比较多,可以使用形态学方式去除小连通域。

%多尺度,自适应阈值
clc,clear all,close all;
I0 = imread('lena.png');    %读取照片
I0 = rgb2gray(I0);%转换为灰度图
figure,imshow(I0);title('原图');
I= I0;
[c,s]=wavedec2(I,2,'db1');%进行2尺度二维离散小波分解。分解小波函数-db1
%detcoef2函数:用来提取二维信号小波分解的细节系数
[cH1,cV1,cD1]=detcoef2('all',c,s,1);%尺度1的所有方向的高频系数  得到垂直 水平 对角方向上的高频细节分量
[cH2,cV2,cD2]=detcoef2('all',c,s,2);%尺度2的所有方向的高频系数
%appcoef2函数:用来提取二维信号小波重构的近似系数
cA1=appcoef2(c,s,'db1',1);%尺度1的低频系数
cA2=appcoef2(c,s,'db1',2);%尺度2的低频系数

%% 初步展示小波变换之后的结果
figure,imshow(I);title('原图');
figure;
subplot(1,2,1),imshow(uint8(cA1));axis off;title('尺度1的低频系数图像');
subplot(1,2,2),imshow(uint8(cA2));axis off;title('尺度2的低频系数图像');
figure;
subplot(2,3,1),imshow(uint8(cH1));axis off;title('尺度1水平方向高频系数');
subplot(2,3,2),imshow(uint8(cV1));axis off;title('尺度1垂直方向高频系数');
subplot(2,3,3),imshow(uint8(cD1));axis off;title('尺度1对角方向高频系数');
subplot(2,3,4),imshow(uint8(cH2));axis off;title('尺度2水平方向高频系数');
subplot(2,3,5),imshow(uint8(cV2));axis off;title('尺度2垂直方向高频系数');
subplot(2,3,6),imshow(uint8(cD2));axis off;title('尺度2对角方向高频系数');


%% 尺度1的模极大值计算
M1=sqrt(cH1.^2+cV1.^2);%尺度1的模值
A1=MyAngle(cV1,cH1);%尺度1的角度
edge1=MyEdge(A1,M1,cV1);%尺度1的边缘
Max_e1=max(edge1(:));%最大值
edge1=edge1/Max_e1;%归一化
threshold1=THR(edge1);%计算阈值
edge1(edge1>threshold1)=1;%超过阈值归为1
edge1(edge1<1)=0;%其余归零
figure,imshow(edge1);title(['尺度1,自适应阈值=',num2str(threshold1)])

%% 尺度2的模极大值计算

M2=sqrt(cH2.^2+cV2.^2);%尺度2的模值
A2=MyAngle(cV2,cH2);%尺度2的角度
edge2=MyEdge(A2,M2,cV2);%尺度2的边缘
Max_e2=max(edge2(:));%最大值
edge2=edge2/Max_e2;%归一化
threshold2=THR(edge2);
edge2(edge2>threshold2)=1;%超过阈值归为1
edge2(edge2<1)=0;%其余归零
figure,imshow(edge2);title(['尺度2,自适应阈值=',num2str(threshold2)])

%如需后续代码请加qq有偿(¥20)获取2126705615

多尺度自适应阈值边缘提取结果
多尺度系细节查看

参考资料:

https://wenku.baidu.com/view/2eb61e4487c24028915fc3b7.html?tdsourcetag=s_pctim_aiomsg&qq-pf-to=pcqq.c2c

https://wenku.baidu.com/view/f26f270b0b4c2e3f572763a8?aggId=2eb61e4487c24028915fc3b7

http://www.dwenzhao.cn/profession/language/matlabwavelet.html

https://blog.csdn.net/SmallerNovice/article/details/55803908

基于小波变换的图像边缘检测_邢尚英;

小波变换的自适应阈值图像边缘检测方法_张宏群

基于小波变换模极大的多尺度…边缘检测在烟雾图像中的应用_王瑞

基于改进小波去噪的图像边缘检测算法_张鹏

dn.net/SmallerNovice/article/details/55803908

基于小波变换的图像边缘检测_邢尚英;

小波变换的自适应阈值图像边缘检测方法_张宏群

基于小波变换模极大的多尺度…边缘检测在烟雾图像中的应用_王瑞

基于改进小波去噪的图像边缘检测算法_张鹏

二进小波变换的图像边缘检测_玛利亚木古丽·麦麦提

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163780.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Centos7 升级内核小版本

    Centos7 升级内核小版本

    2021年5月13日
    133
  • Unity3D :关于UGUI的网格重建、动静分离[通俗易懂]

    Unity3D :关于UGUI的网格重建、动静分离[通俗易懂]前言:无论是网上的攻略还是以前的经验来说,都说UGUI需要进行动静分离。也就是说同一个界面下的UI,可活动的元素放在一个Canvas下,不可活动的元素放在另一个Canvas下。虽然两个Canvas打断了合批,但是却减少了网格的重建时间,总体上是有优化的。究其原因,是因为在同一个Canvas下的某个元素发生变化时,同一Canvas下的所有元素都会进行网格重建(ReBatch)。而静态的元素在…

    2022年5月10日
    48
  • idea注释的快捷键三种方式

    idea注释的快捷键三种方式1、第一种单行注释(ctrl+/)光标处于当前需要写注释的这一行,在这行任何位置都可以,可以调整的,ctrl+/即可实现单行注释,如图,当想取消时,也可以使用ctrl+/取消行注释2、第二种,多行注释(ctrl+shift+/)多行注释,先选中需要注释的这一行,使用ctrl+shift+/即可实现多行注释,当然,想取消的话,也可以使用ctrl+shift+/3、方法或者类说明注释,自动带参数和返回值在需要注释的位置,输入/**,然后按一下enter即可实现,自动根据参数和返回值生成注释,

    2022年9月29日
    7
  • C++11 decltype 的用法

    C++11 decltype 的用法文章目录decltype的意义decltype的用法1.推导规则2.举例说明3.模版案例更多细节问题C++14取消decltype其他decltype的意义参考博客:C++11新标准:decltype关键字有时我们希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量(如果要初始化就用auto了)。为了满足这一需求,C++11新标准引入了decl…

    2025年9月6日
    5
  • java的前端还是后端_java语言是开发前端还是后端的[通俗易懂]

    java的前端还是后端_java语言是开发前端还是后端的[通俗易懂]java语言是开发前端还是后端的发布时间:2020-06-2616:01:18来源:亿速云阅读:105作者:Leahjava语言是开发前端还是后端的?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。java不是前端,是后端。Java语言是最常见的后端开发语言之一,Java语言由于自身具备构建多线程的能力,且体系结构比较中…

    2022年7月7日
    20
  • CRC在线计算器,很好用「建议收藏」

    CRC在线计算器,很好用「建议收藏」http://www.ip33.com/crc.html

    2025年6月2日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号