基于单方向梯度算子,Robert算子,Sobel算子,Priwiff算子,Laplacian算子,多方向模板,LOG算子编写matlab增强程序
最后,显示边缘图像和锐化增强图像,并对这些仿真结果所呈现的边缘提取和增强效果进行对比分析。
图像锐化是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。这种滤波方法提高了地物边缘与周围像元之间的反差,因此也被称为边缘增强。
clc;
I1=imread('D:\01.jpg'); %读取图像
%I1=rgb2gray(I); %将彩色图变成灰色图
subplot(1,3,1);
imshow(I1),title('原图');
mode=[1 2 1;0 0 0;-1 -2 -1];%水平方向锐化模板
[m,n]=size(I1);
I2=double(I1);
for i=2:m-1
for j=2:n-1
I2(i,j)=2*I1(i,j)+I1(i-1,j-1)+I1(i-1,j+1)-I1(i+1,j+1)-2*I1(i+1,j)-I1(i+1,j);
end
end
subplot(1,3,2);
imshow(I2),title('边缘提取后的图像');
I3=I1;
for i=2:m-1
for j=2:n-1
I3(i,j)=2*I1(i,j)+I1(i-1,j-1)+I1(i-1,j+1)-I1(i+1,j+1)-2*I1(i+1,j)-I1(i+1,j)+I1(i,j);
end
end
subplot(1,3,3);
imshow(uint8(I3)),title('锐化后的图像');
由上图可以看出,水平锐化是对水平方向上的边缘信息进行加强,而竖直锐化是对竖直方向上的边缘信息进行加强。
clc;
I1=imread('D:\02.jpg'); %读取图像
%I1=rgb2gray(I); %将彩色图变成灰色图
subplot(1,3,1);
imshow(I1),title('原图');
mode=[1 0 -1;2 0 -2;1 0 -1];%竖直方向锐化模板
[m,n]=size(I1);
I2=double(I1);
for i=2:m-1
for j=2:n-1
I2(i,j)=I1(i-1,j-1)-I1(i-1,j+1)+2*I1(i,j-1)-2*I1(i,j+1)+I1(i+1,j-1)-I1(i+1,j+1);
end
end
subplot(1,3,2);
imshow(I2),title('边缘提取后的图像');
I3=I1;
for i=2:m-1
for j=2:n-1
I3(i,j)=I1(i-1,j-1)-I1(i-1,j+1)+2*I1(i,j-1)-2*I1(i,j+1)+I1(i+1,j-1)-I1(i+1,j+1)+I1(i,j);
end
end
subplot(1,3,3);
imshow(uint8(I3)),title('锐化后的图像');
Robert算子对细节反映较敏感,但提取到的信息量较少,中心位置不明显,图像处理后的边缘不是很平滑。Roberts算子采用对角线方向相邻两像素之差近似梯度幅值检测边缘。检测水平和垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感。
clc;
I1=imread('D:\01.jpg'); %读取图像
%I1=rgb2gray(I); %将彩色图变成灰色图
subplot(1,3,1);
imshow(I1),title('原图','fontsize',16);
mode=[0,-1;
1,0];
[m,n]=size(I1);
I2=double(I1);
for i=2:m-1
for j=2:n-1
I2(i,j)=I1(i+1,j)-I1(i,j+1);
end
end
subplot(1,3,2);
imshow(I2),title('边缘提取后的图像','fontsize',16);
I3=I1;
for i=2:m-1
for j=2:n-1
I3(i,j)=I1(i+1,j)-I1(i,j+1)+I1(i,j);
end
end
subplot(1,3,3);
imshow(uint8(I3)),title('锐化后的图像','fontsize',16);
Sobel算子主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量。Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。Sobel算子引入了平均因素,增强了最近的像素影响,噪声抑制效果比Prewitt算子要好。
clc;
I1=imread('D:\02.jpg'); %读取图像
%I1=rgb2gray(I); %将彩色图变成灰色图
subplot(1,3,1);
imshow(I1),title('原图','fontsize',16);
mode=[-1,0,1;
-2,0,2;
-1,0,1];
[m,n]=size(I1);
I2=double(I1);
for i=2:m-1
for j=2:n-1
I2(i,j)=I1(i+1,j+1)+2*I1(i,j+1)-I1(i+1,j-1)+I1(i-1,j+1)-2*I1(i,j-1)-I1(i-1,j-1);
end
end
subplot(1,3,2);
imshow(I2),title('边缘提取后的图像','fontsize',16);
I3=double(I1);
for i=2:m-1
for j=2:n-1
I3(i,j)=I1(i+1,j+1)+2*I1(i,j+1)-I1(i+1,j-1)+I1(i-1,j+1)-2*I1(i,j-1)-I1(i-1,j-1)+I1(i,j);
end
end
subplot(1,3,3);
imshow(uint8(I3)),title('锐化后的图像','fontsize',16);
Prewitt算子利用像素点上下、左右邻点灰度差,在边缘处达到极值检测边缘。对噪声具有平滑作用,定位精度不够高。Priwiff算子对噪声相对不敏感,有抑制噪声作用,但操作简便,计算方便快捷。
clc
I=imread('D:\02.jpg'); %读取图像
I1=rgb2gray(I); %将彩色图变成灰色图
subplot(1,3,1);
imshow(I1),title('原图','fontsize',16);
model=[-1,0,1;
-1,0,1;
-1,0,1];
[m,n]=size(I1);
I2=zeros(288,340);
for i=2:m-1
for j=2:n-1
I2(i,j)=I1(i-1,j+1)+I1(i,j+1)+I1(i+1,j+1)-I1(i-1,j-1)-I1(i,j-1)-I1(i+1,j-1);
end
end
subplot(1,3,2);
imshow(I2),title('边缘提取后的图像','fontsize',16);
I3=I1;
for i=2:m-1
for j=2:n-1
I3(i,j)=I1(i-1,j+1)+I1(i,j+1)+I1(i+1,j+1)-I1(i-1,j-1)-I1(i,j-1)-I1(i+1,j-1)+I1(i,j);
end
end
subplot(1,3,3);
imshow(uint8(I3)),title('锐化后的图像','fontsize',16);
Laplace算子是一种各向同性算子,二阶微分算子,在只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图象。存在噪声情况下,使用Laplacian算子检测边缘之前需要先进行低通滤波。所以,通常的分割算法都是把Laplacian算子和平滑算子结合起来生成一个新的模板。
clc;clear;
f = rgb2gray(imread('D:\02.jpg'));
f = double(f);
[row,col] = size(f);
%%
L = [0 -1 0;-1 4 -1;0 -1 0];%可以使用模板,用模板内像素值组成矩阵点乘算子;也可直接使用公式形式。
g = zeros(row,col);
for i=2:row-1
for j=2:col-1%求和值必须新图,否则影响后面求和结果
g(i,j) = sum(sum([f(i-1,j-1) f(i-1,j) f(i-1,j+1); ...
f(i,j-1) f(i,j) f(i,j+1); ...
f(i+1,j-1) f(i+1,j) f(i+1,j+1)].*L));
end
end
g1 = zeros(row,col);
for i=1:row
for j=1:col%求和值必须新图,否则影响后面求和结果
g1(i,j) = g(i,j)+f(i,j);
end
end
%%
g=mat2gray(g);
subplot(1,3,1),imshow(uint8(f)),title('原图');
subplot(1,3,2),imshow(g),title('拉普拉斯变换图');
subplot(1,3,3),imshow(uint8(g1)),title('锐化后的图像');
**LOG算子对边缘噪声十分敏感。该方法是将高斯滤波和拉普拉斯检测算子结合在一起进行边缘检测的方法,此种方法在边缘检测前首先通过滤波消除噪声,因此检测效果非常好,图像处理后也很清晰。LOG滤波器方法通过检测二阶导数过零点来判断边缘点。LOG滤波器中的a正比于低通滤波器的宽度,a越大,平滑作用越显著,去除噪声越好,但图像的细节也损失越大,边缘精度也就越低。所以在边缘定位精度和消除噪声级间存在着矛盾,应该根据具体问题对噪声水平和边缘点定位精度要求适当选取。
Robert算子定位比较精确,但由于不包括平滑,所以对于噪声比较敏感。Prewitt算子和Sobel算子都是一阶的微分算子,而前者是平均滤波,后者是加权平均滤波且检测的图像边缘可能大于2个像素。这两者对灰度渐变低噪声的图像有较好的检测效果,但是对于混合多复杂噪声的图像,处理效果就不理想了。 **
clc;
clear;
I=imread('D:\02.jpg'); %读取图像
f=rgb2gray(I); %将彩色图变成灰色图
mode=[0 0 -1 0 0;
0 -1 -2 -1 0;
-1 -2 16 -2 -1;
0 -1 -2 -1 0;
0 0 -1 0 0];%构造LOG算子
[m,n]=size(f);
f=double(f);
g = zeros(m,n);
for i=3:m-2
for j=3:n-2
g(i,j) = sum(sum([f(i-2,j-2) f(i-2,j-1) f(i-2,j) f(i-2,j+1) f(i-2,j+2); ...
f(i-1,j-2) f(i-1,j-1) f(i-1,j) f(i-1,j+1) f(i-1,j+2); ...
f(i,j-2) f(i,j-1) f(i,j) f(i,j+1) f(i,j+2);...
f(i+1,j-2) f(i+1,j-1) f(i+1,j) f(i+1,j+1) f(i+1,j+2);...
f(i+2,j-2) f(i+2,j-1) f(i+2,j) f(i+2,j+1) f(i+2,j+2)].*mode));
end
end
g1 = zeros(m,n);
for i=1:m
for j=1:n%求和值必须新图,否则影响后面求和结果
g1(i,j) = g(i,j)+f(i,j);
end
end
%%
%g=mat2gray(g);
subplot(1,3,1),imshow(uint8(f)),title('原图','fontsize',16);
subplot(1,3,2),imshow(uint8(g)),title('log变换图','fontsize',16);
subplot(1,3,3),imshow(uint8(g1)),title('锐化后的图像','fontsize',16);