Matlab-代码实现图像锐化
图像锐化的目的是使模糊的图像变清晰(这种模糊是在数据获取过程中,由于操作失误导致或经过特殊方法处理后的结果),增强图像的边缘等细节。图像锐化增强边缘的同时会增强噪声,因此一般先去除或减轻噪声,再进行锐化处理。图像锐化可以在空间域或频率域通过高通滤波来实现,即减弱或消除低频分量而不影响高频分量。空间域高通滤波主要通过模板卷积来实现。
一、一阶微分算子锐化图像
实现各种一阶微分算子的函数:
function G = Rob(F, Dx, Dy) %当模板为2*2的矩阵,例如Roberts算子
[m, n] = size(F); %获取图像大小
h = 2;
for i = 1: m
for j = 1: n
if((i < h)|| (j < h)) %图像不能被处理的区域
G(i, j) = double(F(i, j)); continue; %像素值不变
end
%取同样大小的图像块,右下角的像素是待处理的像素
T = double(F(i-1: i, j-1: j));
T1 = Dx.*T; %水平模板处理后的矩阵
T2 = Dy.*T; %垂直模板处理后的矩阵
G(i, j) = (sum(T1(:))^2+sum(T2(:))^2)^0.5; %计算总梯度
end
end
%将计算结果调整到[0,255]的范围
Min = min(G(:));
Max = max(G(:));
s = 255/(Max-Min);
G = uint8((G-Min)*s);
function G = PreSob(F, Dx, Dy) %当模板的维度为奇数,例如水平方向一阶锐化和Sobel算子等
[m, n] = size(F); %获取图像大小
[N, N] = size(Dx); %获取模板大小
h = (N+1)/2;
for i = 1:m
for j = 1:n
if((i < h)|| (j < h)|| (i > m-h+1)|| (j > n-h+1)) %图像不能被处理的区域
G(i, j) = double(F(i, j)); continue; %像素值不变
end
%取同样大小的图像块,中间的像素是待处理的像素
T = double(F(i-h+1: i+h-1, j-h+1: j+h-1));
T1 = Dx.*T; %水平模板处理后的矩阵
T2 = Dy.*T; %垂直模板处理后的矩阵
G(i, j) = (sum(T1(:))^2+sum(T2(:))^2)^0.5; %计算总梯度
end
end
%将计算结果调整到[0,255]的范围
Min = min(G(:));
Max = max(G(:));
s = 255/(Max-Min);
G = uint8((G-Min)*s);
调用函数实现各种一阶微分算子,处理图像:
%% 一阶微分锐化
F = imread('building.jpg');
subplot(2,2,1), imshow(F); title("原图");
%Roberts算法
Dx = [1 0; 0 -1];
Dy = [0 -1; 1 0];
G = Rob(F, Dx, Dy);
subplot(2,2,2), imshow(G); title("Roberts算法");
%Prewitt算子
Dx = [-1 0 1; -1 0 1; -1 0 1];
Dy = [1 1 1; 0 0 0; -1 -1 -1];
G = PreSob(F, Dx, Dy);
subplot(2,2,3), imshow(G); title("Prewitt算子");
%Sobel算子
Dx = [-1 0 1; -2 0 2; -1 0 1];
Dy = [1 2 1; 0 0 0; -1 -2 -1];
G = PreSob(F, Dx, Dy);
subplot(2,2,4), imshow(G); title("Sobel算子");
结果显示:
二、二阶微分Laplacian算子锐化图像
Laplacian算子函数:
function G = Laplacian(F, D, Add)
[m,n] = size(F); %图像大小
[N,N] = size(D); %模板大小
h = (N+1)/2;
for i = 1: m
for j = 1: n
if((i < h)|| (j < h)|| (i > m-h+1)|| (j > n-h+1)) %图像不能被处理的区域
G(i, j) = double(F(i, j)); continue; %像素值不变
end
%取同样大小的图像块,中间的像素是待处理的像素
T = double(F(i-h+1: i+h-1, j-h+1: j+h-1));
T = T.*D; %和模版相乘
G(i, j) = abs(sum(T(:))); %求和并取绝对值
end
end
if(Add == false) %锐化图像
%将计算结果调整到[0,255]的范围
Min = min(G(:));
Max = max(G(:));
s = 255/(Max-Min);
G = uint8((G-Min)*s);
else %锐化图像叠加到原图像
G = uint8(G+double(F));
end
调用函数实现二阶微分Laplacian算子锐化图像:
%% 二阶微分锐化
F = imread('building.jpg');
subplot(1,3,1), imshow(F); title("原图");
%Laplacian算法
D = [0 -1 0; -1 4 -1; 0 -1 0];
G = Laplacian(F, D, false);
subplot(1,3,2), imshow(G); title("锐化图像");
G = Laplacian(F, D, true);
subplot(1,3,3), imshow(G); title("叠加图像");
结果显示: