matlab实现图像滤波、边缘提取(5种算子)、锐化(两种梯度算子)

一.实验目的

1.图像3*3均值滤波,中值滤波。
2.分别用梯度、sobel、拉普拉斯算子进行图像锐化。
3.使用多种算子(至少五种)对图片进行边缘提取。比较各算子特点,分析处理结果,图像中哪些地方处理效果不好,可能原因是什么。

二.实验仪器

PC机,matlab

三.实验原理

  • 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
  • 常见的图像滤波方式有:线性滤波(方框滤波、均值滤波、高斯滤波);非线性滤波(中值滤波、双边滤波)。
  • 均值滤波采用多次测量求平均值的思想,用每一个像素周围的像素的平均值代替自身。均值滤波是方框滤波归一化后的特殊情况。优点:能够将受到噪声影响的像素使用该噪声周围的像素值进行修复,对椒盐噪声的滤除比较好。缺点:不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊。
  • 中值滤波将待处理的像素周围像素从小到大排序,取中值代替该像素。优点:去除脉冲噪声、椒盐噪声的同时又能保留图像边缘细节。缺点:当卷积核较大时,仍然使得图像变得模糊,且计算量很大。
  • 图像锐化是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。这种滤波方法提高了地物边缘与周围像元之间的反差,因此也被称为边缘增强。
  • 边缘检测的基本思想:计算局部微分算子。一阶微分用梯度算子来计算,二阶微分通过拉普拉斯来计算。
  • Sobel算子是像素图像边缘检测中最重要的算子之一。在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量或是其法矢量。
  • Laplacian算子是n维欧几里得空间中的一个二阶微分算子,定义为梯度grad()的散度div()。
  • Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,Robert算子图像处理后结果边缘不是很平滑。经分析,由于Robert算子通常会在图像边缘附近的区域内 产生较宽的响应,故采用上述算子检测的边缘图像常需做细化处理,边缘定位的精度不是很高。
  • Prewitt算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用 。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。

四.实验完整代码

均值滤波实验

%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('锐化后的图像');

五.实验结果及分析

均值滤波实验结果如下:

  • 原图
  • 加入噪声后的图像
  • 均值滤波后的图像

    实验一的结果分析与总结:
    从图1.3均值滤波后的图像可以看出,均值滤波的效果较差,不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊。

中值滤波实验结果如下:

在实验一已经加入噪声的图片进行中值滤波,得到的滤波后的图像如下:

  • 中值滤波后的图像

    实验二的结果分析与总结:
    从图2.1中值滤波后的图像可以看出,中值滤波的效果相较于均值滤波效果更好,滤波后的图像基本与原图一致。

边缘提取实验结果

  • 原图
  • 灰度转换后的图像
  • Sobel算子边缘检测
  • Robert算子边缘检测
  • Prewitt算子边缘检测
  • Log算子边缘检测
  • Canny算子边缘检测

从图3.3至3.7可以看出边缘检测比较好的是Roberts、Sobel、Prewitt算子。Roberts算子边缘提取的线最粗,由于Roberts边缘检测算子是一种利用局部查分算子寻找边缘的算子,因此对图像处理后的结果边缘不是很平滑。
Canny算子能够检测到弱边缘,使用两种不同的阈值分别检测强边缘和弱边缘,并且仅当弱边缘与强边缘相连时,将弱边缘包含在输出图像中。
Sobel和Prewitt都是对图像先做加权平滑处理,然后再做微分运算,所不同的是平滑部分的权值有些差异,因此对噪声具有一定的抑制能力,但不能完全排除检测结果中出现的虚假边缘。
Laplacian是不依赖于边缘方向的二阶微分算子,对图像中的阶跃型边缘定位准确,对噪声敏感,容易丢失一部分边缘的方向信息,造成一些不连续的检测边缘

图像锐化实验结果

梯度算子(水平方向)图像锐化:

梯度算子(垂直方向)图像锐化:

Sobel算子图像锐化:

Laplacian算子图像锐化:

实验四的结果分析与总结:
在梯度算子中,水平锐化是对水平方向边缘信息的加强,竖直锐化是对竖直方向的边缘信息加强。
Sobel对噪声具有平滑作用,可以提供较为精确的边缘方向信息。
Laplace算子是一种各向同性算子,二阶微分算子,在只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图象。存在噪声情况下,使用Laplacian算子检测边缘之前需要先进行低通滤波

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2023年12月5日
下一篇 2023年12月5日

相关推荐