大家好,又见面了,我是你们的朋友全栈君。
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
基于小波变换的图像边缘检测_邢尚英;
小波变换的自适应阈值图像边缘检测方法_张宏群
基于小波变换模极大的多尺度…边缘检测在烟雾图像中的应用_王瑞
基于改进小波去噪的图像边缘检测算法_张鹏
二进小波变换的图像边缘检测_玛利亚木古丽·麦麦提
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163780.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...