以下算法,我会给出简单的循环代码,函数代码请自行搜索
1、 利用梯度法进行图像边缘锐化,根据下面两种梯度的定义方式,分别输出利用梯度法锐化后的图像。其中图像梯度的定义为:
G(i,j)=根号下[f(i+1,j)-f(i,j)] ^2+ [f(i,j+1)-f(i,j)] ^2
G(i,j)=|f(i+1,j)-f(i,j)|+|f(i,j+1)-f(i,j)|
2 、将上述输出结果与利用MATLAB求梯度函数gradient()所得的图像锐化结果进行对比。
3、利用梯度的交叉差分法,称为罗伯特差分法Roberts,进行图像锐化,并输出锐化后的图像。其中交叉差分的梯度定义为:
G(i,j)=|f(i+1,j+1)-f(i,j)|+|f(i+1,j)-f(i,j+1)|
4、利用Sobel算子对图像进行锐化,并输出锐化后的图像,其中sobel算子的定义为:
g(i,j)={d1^2+d2^2}^1/2
比较Sobel算子得到的锐化图像与Roberts差分法所得到的锐化图像的异同。
t=imread("lena.bmp");
% 检查图像是否已经是灰度图像
if size(t, 3) == 1
T = t(:, :, 1); % 如果是RGB图像,取第一个通道
else
T = t; % 如果是灰度图像,直接使用
end
%取出图像的长宽
[x,y]=size(T);
%梯度1,梯度2
c1=zeros(x-1,y-1);
c2=zeros(x-1,y-1);
T1=T;
T2=T;
for i=1:x-1
for j=1:y-1
a=T(i,j+1)-T(i,j);
b=T(i+1,j)-T(i,j);
n1=a^2+b^2;
c1(i,j)=sqrt(double(n1));
if n1>50
T1(i,j)=100;
else
T1(i,j)=0;
end
n2=abs(a)+abs(b);
c2(i,j)=n2;
if n2>10
T2(i,j)=100;
else
T2(i,j)=0;
end
end
end
% Gradient算法
[Gx, Gy] = gradient(double(T));
% 计算梯度的大小
G_mag = sqrt(Gx.^2 + Gy.^2);
% 归一化梯度大小以便于显示
G_mag = G_mag / max(G_mag(:));
figure;
subplot(1,3,1);imshow(T1),title("梯度1");
subplot(1,3,2);imshow(T2),title("梯度2");
subplot(1,3,3);imshow(G_mag, []),title('Gradient');
%Roberts算法
w=[1 0;0 -1];
h=[0 1;-1 0];
T3=T;
for i=2:x-1
for j=2:y-1
p=T(i,j)-T(i+1,j+1);
q=T(i+1,j)-T(i,j+1);
n3=abs(p)+abs(q);
if n3>10
T3(i,j)=100;
else
T3(i,j)=0;
end
end
end
%Sobel算法1
Sx = [-1 0 1; -2 0 2; -1 0 1];
Sy = [1 2 1; 0 0 0; -1 -2 -1];
Gx1 = imfilter(double(T), Sx, 'replicate');
Gy1 = imfilter(double(T), Sy, 'replicate');
G1= sqrt(Gx1.^2 + Gy1.^2);
T4= im2uint8(mat2gray(G1));
%Sobel算法2
T5=T;
T=double(T);
s=double(zeros(x,y));
for i=2:x-1
for j=2:y-1
d1 = -T(i-1, j-1) + T(i-1, j+1) - 2*T(i, j-1) + 2*T(i, j+1) - T(i+1, j-1) + T(i+1, j+1);
d2 = -T(i-1, j-1) - 2*T(i-1, j) - T(i-1, j+1) + T(i+1, j-1) + 2*T(i+1, j) + T(i+1, j+1);
n4=d1^2 + d2^2;
s(i,j) = sqrt(n4);
% % 确保 n4 是非负数,然后计算平方根
% if n4 >= 0
%
% else
% % 如果 n4 是负数或 NaN,可以设置为一个默认值或进行错误处理
% s(i,j) = 0; % 或者使用其他合适的默认值
% end
if s(i,j)>30
T5(i,j)=100;
else
T5(i,j)=0;
end
end
end
figure;
subplot(1,3,1),imshow(T3),title('Roberts');
subplot(1,3,2),imshow(T4),title('Sobel算法1');
subplot(1,3,3),imshow(T5),title('Sobel算法2');