Sobel算子原理及matlab实现代码

一、基本原理

Sobel算子使用梯度进行边缘增强,它考虑图像3×3邻域的处理。
对于图像f(x,y),取该图像的3×3的区域,如下图
Sobel算子原理及matlab实现代码_第1张图片
x方向的偏微分定义为:
在这里插入图片描述
y方向的偏微分定义为:
在这里插入图片描述
则梯度幅值为:
在这里插入图片描述
Sobel算子由两个模板组成,将图像分别与两个模板做卷积,取它们的绝对值之和作为该像素点的灰度值,处理完毕后便产生一幅边缘强度图像。Sobel算子的模板如下:
Sobel算子原理及matlab实现代码_第2张图片

二、实现步骤

(1)将原图像f(x,y)与Sobel算子的第1个模板做卷积,得到g1(x,y);
(2)将原图像f(x,y)与Sobel算子的第2个模板做卷积,得到g2(x,y);
(3)取|g1(x,y)| + |g2(x,y)|为Sobel算子处理后的图像。

三、效果演示

使用Sobel算子进行边缘增强的效果如下图所示,可以发现图像的边缘变得清晰可见:
Sobel算子原理及matlab实现代码_第3张图片

四、matlab实现代码

%% Sobel算子
clear,close all
srcImg = imread('Sobel算子用.tif');
h = figure(1);
sizeScreen = get(0,'ScreenSize');
set(h,'position',sizeScreen)
subplot(121)
imshow(srcImg);
title('原始图像','fontsize',24);
srcImg = double(srcImg);
[rows,cols] = size(srcImg);
dstImg = srcImg;
mask_X = [-1 -2 -1;...
           0  0  0;...
           1  2  1];
mask_Y = [-1 0 1;...
          -2 0 2;...
          -1 0 1;];
for i = 1:rows-2
    for j = 1:cols-2
        temp_X = mask_X.*srcImg(i:i+2,j:j+2);
        temp_Y = mask_Y.*srcImg(i:i+2,j:j+2);
        temp_X = sum(temp_X(:));
        temp_Y = sum(temp_Y(:));
        dstImg(i+1,j+1) = abs(temp_X)+abs(temp_Y);
    end
end
dstImg = uint8(dstImg);
subplot(122)
imshow(dstImg);
title('Sobel算子处理后的图像','fontsize',24);

你可能感兴趣的:(matlab,开发语言,计算机视觉)