图像锐化(边缘检测)

参考:<<数字图像处理——使用MATLAB分析与实现>> 清华大学出版社 蔡利梅主编
1.什么是图像锐化(边缘检测)?
亮度突变的区域
在这里插入图片描述
2.边缘的分类
细线型边缘,突变型边缘,渐变型边缘
在这里插入图片描述
在这里插入图片描述
突变型边缘一阶导数取极值,细线型边缘一阶导数取0值

3.一阶微分算子(针对突变型边缘)
a.梯度算子(梯度计算原理–>导数计算原理)
在这里插入图片描述
在这里插入图片描述
图像锐化的实质是原图像和梯度图像相加以增强图中的变化
模板罩不住的像素点直接赋背景值0

clear,clc;
Image = im2double( rgb2gray( imread( 'face2.jpg' )));
subplot(131 ),imshow( Image) ,title('原始图像');
[ h, w ] = size( Image) ; 
edgeImage = zeros( h, w );    %不存在右邻点和上邻点的区域直接赋值为0
for x = 1:w-1   %为什么-1,因为最右端直接赋值为0,不用处理,0为黑
    for y= 1 :h-1
        %梯度运算
        edgeImage(y,x) = abs(Image(y,x+ 1) -Image(y,x) ) + abs(Image(y + 1,x)-Image( y, x)) ;
    end
end
subplot(132) , imshow (edgeImage) , title('梯度图像');
sharpImage = Image + edgeImage;

subplot(133 ) , imshow( sharpImage) ,title('锐化图像');  %锐化图像

在这里插入图片描述
补充:梯度数学:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

b.Robert算子(相邻点相减)
在这里插入图片描述
对于imfilter函数,默认相关运算,即模板与函数对应相称,原数组补0,对于奇模板,直接补零即可,对于偶模板,如果指定偶数大小的核 h,则核的中心是 floor((size(h) + 1)/2)。

%将上面梯度计算公式改为交叉求微分即可
%这里使用库函数
clear,clc;
Image = im2double(rgb2gray( imread( 'face2.jpg') )) ;
figure,imshow(Image),title('原始图像');
BW = edge( Image, 'roberts');
%使用Robert算子进行边缘检测,得到二值边界图像,选取阈值,大于阈值取1,小于阈值取0
figure,imshow(BW) ,title( 'Robert边缘检测');
H1=[1 0; 0 -1];H2=[0 1;-1 0] ;
% Robert算子模板
R1 = imfilter(Image,H1);       %逐个像素对应元素相乘,边界补0,相关运算
R2 = imfilter(Image, H2);
edgeImage = abs(R1) + abs(R2);  %取绝对值
%基于模板运算获取 Robert梯度图像
figure,imshow (edgeImage) ,title( 'Robert梯度图像');
sharpImage = Image + edgeImage;
%锐化图像
figure,imshow( sharpImage),title( 'Robert锐化图像');

在这里插入图片描述
可以看出,阈值选取不同,所带来的边缘检测效果不同,因此要合理选择阈值

c.Sobel算子(左右点相减)
f’(x) = lim(h→0)[f(x+h)-f(x-h)]/2h(对于图像,相加不可能出现负值)
在这里插入图片描述

clear,clc;
Image = im2double(rgb2gray( imread( 'face2.jpg') )) ;
figure,imshow(Image),title('原始图像');
BW = edge( Image, 'sobel');
%使用sobel算子进行边缘检测,得到二值边界图像,选取阈值,大于阈值取1,小于阈值取0
figure,imshow(BW) ,title( 'sobel边缘检测');
H1=[-1 -2 -1;0 0 0;1 2 1];H2=[-1 0 1;-2 0 2;-1 0 1] ;
% sobel算子模板
R1 = imfilter(Image,H1);
R2 = imfilter(Image,H2);
edgeImage = abs(R1) + abs(R2);
%基于模板运算获取 sobel梯度图像
figure,imshow(edgeImage) ,title('sobel梯度图像');
sharpImage = Image + edgeImage;
%锐化图像
figure,imshow(sharpImage),title('sobel锐化图像');

在这里插入图片描述
8个模板算子:
在这里插入图片描述

d.prewitt算子
在这里插入图片描述

Image = im2double( rgb2gray(imread( 'face2.jpg' ) ));
H1=[-1 -1 -1;0 0 0;1 1 1];H2=[0 -1 -1;1 0 -1;1 1 0];
H3 =[1 0 -1;1 0 -1;1 0 -1];H4= [1 1 0;1 0 -1;0 -1 -1] ;
H5=[1 1 1;0 0 0;-1 -1 -1];H6= [0 1 1;-1 0 1;-1 -1 0 ];
H7=[-1 0 1;-1 0 1;-1 0 1];H8=[-1 -1 0;-1 0 1;0 1 1];

R1 = imfilter( Image, H1 ) ;R2= imfilter( Image, H2);
R3 = imfilter( Image, H3 ) ;R4 = imfilter( Image , H4 );
R5 = imfilter( Image, H5 ) ;R6= imfilter( Image, H6) ;
R7 = imfilter( Image, H7 ) ;R8 = imfilter( Image , H8);

edgeImage1 = abs(R1 ) + abs(R7 );sharpImage1 = edgeImage1 + Image;
f1 = max ( max(R1,R2 ) , max(R3,R4));f2 = max( max(R5,R6 ) , max(R7 , R8) );
edgeImage2 = max( f1, f2);sharpImage2 = edgeImage2+ Image;
subplot(221 ),imshow( edgeImage1 ) ,title( '两个模板梯度图像');
subplot(222),imshow( edgeImage2 ) , title( '八个模板梯度图像');
subplot(223 ) , imshow( sharpImage1 ) ,title('两个模板锐化图像');
subplot(224 ),imshow(sharpImage2) ,title('八个模板锐化图像');

4.二阶微分算子(细线型边缘)
Laplacian算子
在这里插入图片描述

clc,clear;
Image = im2double( rgb2gray( imread( 'face2.jpg' )));
figure,imshow(Image) ,title('原图');
H= fspecial( 'laplacian' , 0 ) ;   %生成Laplacian模板
R = imfilter(Image,H);       % Laplacian 算子滤波
edgeImage = abs(R);         %获取Laplacian算子滤波图像
figure,imshow (edgeImage) ,title('拉普拉斯滤波图像');
H1= [ 0 -1 0;-1 5 -1;0 -1 0];     % Laplacian锐化模板
sharpImage = imfilter( Image, H1 ) ;
figure,imshow( sharpImage) , title( '拉普拉斯锐化图像');

5.先平滑滤波后边缘提取
canny算子:
目前公认最好

6.频率域高通域滤波(将上一个文章的取值取反),因为边缘对应高频成分

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值