Matlab数字图像锐化

 以下算法,我会给出简单的循环代码,函数代码请自行搜索

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');



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值