1.图像3*3均值滤波,中值滤波。
2.分别用梯度、sobel、拉普拉斯算子进行图像锐化。
3.使用多种算子(至少五种)对图片进行边缘提取。比较各算子特点,分析处理结果,图像中哪些地方处理效果不好,可能原因是什么。
PC机,matlab
%1.导入图像
img = imread('1.jpg'); %导入需要过滤的图像
n = 3; %模板大小
[height,width] = size(img); %获取图像的尺寸
imshow(img); %显示原图
%2.给图像加入椒盐噪声
img = imnoise(img,'salt & pepper');
figure;
imshow(img); %显示加入噪声后的图片
%进行均值滤波
img1 = double(img); %数据类型转换
img2 = img1; %将转换后的数据赋给img2
for i = 1:height-n+1
for j = 1:width-n+1
c = img1(i:i+(n-1),j:j+(n-1)); %在img1中从头取模板大小的块赋给c
e=c(1,:); %e中存放是c矩阵的第一行
for u=2:n %将c中的其他行元素取出来接在e后使e为一个行矩阵
e=[e,c(u,:)];
end
s=sum(e); %取一行的和
img2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); %将模板各元素的均值赋给模板中心位置的元素
end
end
d = uint8(img2); %未被赋值的元素取原值
figure;
imshow(d); %显示过滤图片
%中值滤波实验
%1.导入图像
img = imread('1.jpg'); %导入需要过滤的图像
n = 3; %模板大小
[height,width] = size(img); %获取图像的尺寸
imshow(img); %显示原图
%2.给图像加入椒盐噪声
img = imnoise(img,'salt & pepper');
figure;
imshow(img); %显示加入噪声后的图片
%进行中值滤波
img1 = double(img); %数据类型转换
img2 = img1;
for i=1:height-n+1
for j=1:width-n+1
c=img1(i:i+(n-1),j:j+(n-1)); %在x1中从头取模板大小的块赋给c
e=c(1,:); %e中存放是c矩阵的第一行
for u=2:n %将c中的其他行元素取出来接在e后使e为一个行矩阵
e=[e,c(u,:)];
end
med=median(e); %取一行的中值
img2(i+(n-1)/2,j+(n-1)/2)=med; %将模板各元素的中值赋给模板中心位置的元素
end
end
d = uint8(img2); %未被赋值的元素取原值
figure;
imshow(d); %显示过滤图片
%1.导入图像
img = imread('2.jpg'); %导入需要过滤的图像
imshow(img)
%2.彩色图转灰色图
img1 = rgb2gray(img);
imshow(img1);
%Sobel算子边缘提取图像
model=[-1,0,1;
-2,0,2;
-1,0,1];
[m,n]=size(img1);
img2=double(img1);
for i=2:m-1
for j=2:n-1
img2(i,j)=img1(i+1,j+1)+2*img1(i+1,j)+img1(i+1,j-1)-img1(i-1,j+1)-2*img1(i-1,j)-img1(i-1,j-1);
end
end
imshow(img2) %显示Sobel算子边缘检测的图像
%Robert算子边缘检测图像
model=[0,-1;1,0];
[m,n]=size(img1);
img2=double(img1);
for i=2:m-1
for j=2:n-1
img2(i,j)=img1(i+1,j)-img1(i,j+1);
end
end
imshow(img2)
%Prewitt算子边缘检测
model=[-1,0,1;
-1,0,1;
-1,0,1];
[m,n]=size(img1);
I2=img1;
for i=2:m-1
for j=2:n-1
tem=img1(i-1:i+1,j-1:j+1);
tem=double(tem).*model;
img2(i,j)=sum(sum(tem));
end
end
%log算子边缘检测
model=[-1,0,1;
-1,0,1;
-1,0,1];
for i=3:m-2
for j=3:n-2
tem=double(t(i-2:i+2,j-2:j+2)).*model;
x=sum(sum(tem));
tt(i,j)=x;
end
end
%Laplacian算子
I=imread('2.jpg');
I1=mat2gray(I);%实现图像矩阵的归一化操作
[m,n]=size(I1);
newGrayPic=I1;%为保留图像的边缘一个像素
LaplacianNum=0;%经Laplacian算子计算得到的每个像素的值
LaplacianThreshold=0.2;%设定阈值
for j=2:m-1 %进行边界提取
for k=2:n-1
LaplacianNum=abs(4*I1(j,k)-I1(j-1,k)-I1(j+1,k)-I1(j,k+1)-I1(j,k-1));
if(LaplacianNum > LaplacianThreshold)
newGrayPic(j,k)=255;
else
newGrayPic(j,k)=0;
end
end
end
使用实验三中的sobel和Laplacian算子进行图像锐化,补充梯度算子进行图像锐化如下:
%1.导入图像
img = imread('2.jpg'); %导入需要过滤的图像
imshow(img)
%2.彩色图转灰色图
img1 = rgb2gray(img);
imshow(img1);
%Sobel算子边缘提取图像
model=[-1,0,1;
-2,0,2;
-1,0,1];
[m,n]=size(img1);
img2=double(img1);
for i=2:m-1
for j=2:n-1
img2(i,j)=img1(i+1,j+1)+2*img1(i+1,j)+img1(i+1,j-1)-img1(i-1,j+1)-2*img1(i-1,j)-img1(i-1,j-1);
end
end
imshow(img2) %显示Sobel算子边缘检测的图像
%Robert算子边缘检测图像
model=[0,-1;1,0];
[m,n]=size(img1);
img2=double(img1);
for i=2:m-1
for j=2:n-1
img2(i,j)=img1(i+1,j)-img1(i,j+1);
end
end
imshow(img2)
%Prewitt算子边缘检测
model=[-1,0,1;
-1,0,1;
-1,0,1];
[m,n]=size(img1);
I2=img1;
for i=2:m-1
for j=2:n-1
tem=img1(i-1:i+1,j-1:j+1);
tem=double(tem).*model;
img2(i,j)=sum(sum(tem));
end
end
%log算子边缘检测
model=[-1,0,1;
-1,0,1;
-1,0,1];
for i=3:m-2
for j=3:n-2
tem=double(t(i-2:i+2,j-2:j+2)).*model;
x=sum(sum(tem));
tt(i,j)=x;
end
end
%Laplacian算子
I=imread('2.jpg');
I1=mat2gray(I);%实现图像矩阵的归一化操作
[m,n]=size(I1);
newGrayPic=I1;%为保留图像的边缘一个像素
LaplacianNum=0;%经Laplacian算子计算得到的每个像素的值
LaplacianThreshold=0.2;%设定阈值
for j=2:m-1 %进行边界提取
for k=2:n-1
LaplacianNum=abs(4*I1(j,k)-I1(j-1,k)-I1(j+1,k)-I1(j,k+1)-I1(j,k-1));
if(LaplacianNum > LaplacianThreshold)
newGrayPic(j,k)=255;
else
newGrayPic(j,k)=0;
end
end
end
I2=rgb2gray(I); %将彩色图变成灰色图
subplot(131),imshow(I2),title('原图');
subplot(132),
imshow(newGrayPic);
title('Laplacian算子的处理结果')
t=I1+newGrayPic;
subplot(133),imshow(t),title('图像锐化后')
%1.
clc;
I1=imread('2.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);
I4 = rgb2gray(uint8(I3));
imshow(I4),title('锐化后的图像');
在实验一已经加入噪声的图片进行中值滤波,得到的滤波后的图像如下:
从图3.3至3.7可以看出边缘检测比较好的是Roberts、Sobel、Prewitt算子。Roberts算子边缘提取的线最粗,由于Roberts边缘检测算子是一种利用局部查分算子寻找边缘的算子,因此对图像处理后的结果边缘不是很平滑。
Canny算子能够检测到弱边缘,使用两种不同的阈值分别检测强边缘和弱边缘,并且仅当弱边缘与强边缘相连时,将弱边缘包含在输出图像中。
Sobel和Prewitt都是对图像先做加权平滑处理,然后再做微分运算,所不同的是平滑部分的权值有些差异,因此对噪声具有一定的抑制能力,但不能完全排除检测结果中出现的虚假边缘。
Laplacian是不依赖于边缘方向的二阶微分算子,对图像中的阶跃型边缘定位准确,对噪声敏感,容易丢失一部分边缘的方向信息,造成一些不连续的检测边缘
梯度算子(水平方向)图像锐化:
梯度算子(垂直方向)图像锐化:
Sobel算子图像锐化:
Laplacian算子图像锐化:
实验四的结果分析与总结:
在梯度算子中,水平锐化是对水平方向边缘信息的加强,竖直锐化是对竖直方向的边缘信息加强。
Sobel对噪声具有平滑作用,可以提供较为精确的边缘方向信息。
Laplace算子是一种各向同性算子,二阶微分算子,在只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图象。存在噪声情况下,使用Laplacian算子检测边缘之前需要先进行低通滤波