Matlab采用梯度算子、拉普拉斯算子、Sobel算子及Prewitt算子对图像进行锐化
程序员文章站
2022-07-14 11:02:17
...
Matlab采用梯度算子、拉普拉斯算子、Sobel算子及Prewitt算子对图像进行锐化
梯度算子
设图像为f(x,y), 定义为f(x,y)在点(x,y)的梯度矢量为G[f(x,y)]:
性质:
1)梯度的方向是在f(x,y)的最大变化率方向上
2)梯度的幅度用G[f(x,y)]表示:
梯度
对于数字图像:
简化为:
Roberts梯度(交叉梯度)
对于数字图像:
简化为:
拉普拉斯算子
拉普拉斯算子:
线性、各向同性(旋转不变)
对于数字图像f(i,j),其一阶导数:
二阶偏导数为:
拉普拉斯算子模板表示:
注意:
1)有时g(x,y)输出小或为负
2)有时g(x,y)的增强可能超出范围,需要变回0~L-1尺度中
Robel算子
基本思想:
以待增强图像的任意像素(i,j)为中心,截取一个3X3的像素窗口,先分别计算窗口中像素在x,y方向的梯度:
增强后(i,j)点的亮度:
可简化为:
优点:
1)由于引入了加权平均,所以对图像中的随机噪声具有一定的平滑作用
2)由于采用间隔两行或两列的查分,边缘两侧的像素得到增强,锐化图像的边缘显得粗而亮
S_x,S_y可用卷积模板来实现:
可见:其重点放在接近于模板中心的像素点
Prewitt算子
基本思想:
与Sobel算子相同,方程的形式相同,但其中系数不同:
可见:与Sobel算子不同,其重点没有放在接近于模板中心的像素点
整体程序:
clc;
clear all;
img = imread('F:\1.jpg');
img = rgb2gray(img);
subplot(2,3,1);
imshow(img);
title('原始图像');
[m,n] = size(img);
T = 20;
%Roberts算子
imgr = zeros(m,n);
for i=2:m-1
for j=2:n-1
imgr(i,j)= abs(img(i,j)-img(i+1,j+1)) + abs(img(i+1,j)-img(i,j+1));
if imgr(i,j)<T
imgr(i,j) = 0;
else
imgr(i,j) = 255;
end
end
end
subplot(2,3,2);
imshow(imgr);
title('Roberts算子图像');
%Laplace算子
imgl = zeros(m,n);
for i=2:m-1
for j=2:n-1
imgl(i,j)= abs(img(i+1,j)+img(i-1,j)+img(i,j+1)+img(i,j-1)-4*img(i,j));
if imgl(i,j)<T
imgl(i,j) = 0;
else
imgl(i,j) = 255;
end
end
end
subplot(2,3,3);
imshow(imgl);
title('Laplace算子图像');
%Sobel算子
imgs = zeros(m,n);
for i=2:m-1
for j=2:n-1
imgs(i,j)= abs(img(i-1,j+1)+2*img(i,j+1)+img(i+1,j+1)-img(i-1,j-1)-2*img(i,j-1)-img(i+1,j-1)) + abs(img(i+1,j-1)+2*img(i+1,j)+img(i+1,j+1)-img(i-1,j-1)-2*img(i-1,j)-img(i-1,j+1));
if imgs(i,j)<T
imgs(i,j) = 0;
else
imgs(i,j) = 255;
end
end
end
subplot(2,3,4);
imshow(imgs);
title('Sobel算子图像');
%Prewitt算子
imgp = zeros(m,n);
for i=2:m-1
for j=2:n-1
imgp(i,j)= abs(img(i-1,j+1)+img(i,j+1)+img(i+1,j+1)-img(i-1,j-1)-img(i,j-1)-img(i+1,j-1)) + abs(img(i+1,j-1)+img(i+1,j)+img(i+1,j+1)-img(i-1,j-1)-img(i-1,j)-img(i-1,j+1));
if imgp(i,j)<T
imgp(i,j) = 0;
else
imgp(i,j) = 255;
end
end
end
subplot(2,3,5);
imshow(imgp);
title('Prewitt算子图像');