Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化

  1. 要求

参考Sobel算子能够检测x和y方向的原理,设计合适的模板,能够检测±45°斜方向上的图像细节,分别输出正45度方向和负45度方向的图像细节,以及两者相叠加后的图像结果。将取的图像细节,叠加到原图上,实现图像锐化。

  1. Sobel算子

Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化 Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化

Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化 用来强调水平边缘,Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化用来强调垂直边缘。

Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化

图片来自链接

这里有3个矩阵,分别是

Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化,可以看到在Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化矩阵中,以6为中心的3*3的小矩阵与Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化进行运算(对应位置相乘后求和),运算的结果存放在Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化矩阵中和6对应的位置。

同理,在6的右侧的元素2,经过运算,其在

Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化矩阵中对应位置的值为

(0-1) + (10) + (51) + (6-2) + (20) + (42) + (4-1) + (10) + (0*1) = -3

一般地,如果对

Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化使用Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化进行卷积处理,则

Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化

这时候肯定有人会问:那

Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化矩阵左上角的元素3,它对应Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化矩阵中的值是多少?

这是一个很好的问题,可以看到,以3(第一行第一列)为中心的3*3的矩阵缺失了5个元素,这种情况下一般有两种处理方式:

1. Padding即对缺失的元素进行填充,一般使用0进行填充

2. 不做处理,直接用它本身的值3作为最终值填入Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化 矩阵

  1. matlab代码实践

参考sobel算子中的

Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化,可以发现:

(1)Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化 中的元素是纵向排列,矩阵所有元素和为0,用以检测水平边缘;

(2)Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化 中的元素是横向排列,矩阵所有元素和为0,用以检测竖直边缘。

于是可以猜想:

(1)检测正45°方向的模板,其矩阵中的元素应该按负45度方向排列,且所有元素和为0;

(2)检测负45°方向的模板,其矩阵中的元素应该按正45度方向排列,且所有元素和为0。

Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化 Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化

其中

Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化用以检测正45度方向,Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化用以检测负45度方向。

matlab提供了官方函数filter2,可以使用指定的模板对图像进行卷积处理

clear, close all
% 检测正45°方向的模板
h1 = [ -1  0  0;
        0  2  0;
        0  0 -1];
% 检测负45°方向的模板
h2 = [  0  0 -1;
        0  2  0;
       -1  0  0];
im = imread('cameraman.tif');
subplot(2,2,1), imshow(im), title('原图')

im_filter_1 = filter2(h1, im)/255;
subplot(2,2,2), imshow(im_filter_1), title('45°')

im_filter_2 = filter2(h2, im)/255;
subplot(2,2,3), imshow(im_filter_2), title('-45°')

im_filter_3 = filter2(h1+h2, im)/255;
subplot(2,2,4), imshow(im_filter_3), title('叠加')

观察下图,可以发现,在默认情况下,向filter2函数中传入模板和图像矩阵,得到的卷积结果的四条边界非常突出,进一步观察原矩阵即未除以255之前的矩阵,可以发现matlab中的filter2函数对边界值的处理,默认不采取先padding再卷积的方式,而是不做处理直接填入。

再提一下为什么要将卷积结果除以255。当出现如下情况的时候,卷积后的矩阵中会出现大于255的值,而灰度值的范围是在[0, 255],为了让卷积后的结果仍能落在这个区间,所以我对卷积结果除以了255。

Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化

Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化

为了得到锐化后的图像, 最后只需要使用im_filter_3放大一定倍数再和im进行叠加处理即可。

im是uint8类型的矩阵,im_filter_350的结果是double类型的矩阵,二者不能直接相加,于是我使用uint8函数将im_filter_350的结果转换为uint8类型(浮点数转为整数,超过255的数值变为255,低于0的数值变为0,0-255之间的数值不变)

两个uint8类型的矩阵的矩阵相加,其结果仍为uint8类型的矩阵(超过255的数值变为255,低于0的数值变为0,0-255之间的数值不变)。

这里留下一个思考:之前卷积的结果能不能不除以255,而是使用uint8进行转换?

figure
subplot(1,2,1), imshow(im), title('原图')
im_boost = im + uint8(im_filter_3*50);
subplot(1,2,2), imshow(im_boost), title('增强')

Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化

观察结果可以发现,锐化后的图像其正负45度方向的边缘明显比原图清晰突出。

  1. 代码获取

Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化

关注公众号,回复”数字图像处理”即可获取完整代码

Original: https://blog.csdn.net/qq_42276781/article/details/121983264
Author: Toblerone_Wind
Title: Matlab仿照Sobel算子实现±45°图像细节检测和图像锐化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/644773/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球