拉普拉斯算子的原理和matlab实现代码

一、基本原理

拉普拉斯算子是一种二阶导数算子,是各向同性的微分运算,具有旋转不变性,可以满足不同走向的图像边界的锐化要求。
对一个二维图像函数f(x,y),它的拉普拉斯算子定义为:
在这里插入图片描述
x方向上的二阶微分定义为:
在这里插入图片描述
y方向上的二阶微分定义为:
在这里插入图片描述
所以,对于数字图像,离散函数f(x,y)的拉普拉斯算子表示为:
在这里插入图片描述
这个公式可以用如下图所示的滤波模板来表示:
拉普拉斯算子的原理和matlab实现代码_第1张图片

二、实现步骤

(1)将原图像f(x,y)与拉普拉斯算子的模板做卷积,得到拉普拉斯滤波后的图像g1(x,y);
(2)由于拉普拉斯模板的中心系数为负,取g2(x,y)=f(x,y)-g1(x,y);
(3)对g2(x,y)进行标定,得到拉普拉斯锐化后的图像g (x,y)。

三、效果演示

使用拉普拉斯算子进行图像锐化的效果如下图所示。可以看到,拉普拉斯算子处理后的图像比原图像更清晰,使图像中的细节部分得到了增强,并良好地保留了图像的背景色调:
拉普拉斯算子的原理和matlab实现代码_第2张图片

四、matlab代码

%% 拉普拉斯算子
clear,close all 
clc
srcImg = imread('Laplace算子用.tif');
h = figure(1);
sizeScreen = get(0,'ScreenSize');
set(h,'position',sizeScreen)
subplot(221)
imshow(srcImg);
title('原始图像','fontsize',18);
srcImg = double(srcImg);
[rows,cols] = size(srcImg);
lapImg = zeros(rows,cols);
mask = [0  1  0;...
        1 -4  1;...
        0  1  0];
for i = 1:rows-2
    for j = 1:cols-2
        temp = mask.*srcImg(i:i+2,j:j+2);
        lapImg(i+1,j+1) = sum(temp(:));
    end
end
lapImg_unscaling = uint8(lapImg);
subplot(222)
imshow(lapImg_unscaling);
title('拉普拉斯滤波后的图像(未标定)','fontsize',18);
lapImg_scaling = scale(lapImg);
lapImg_scaling = uint8(lapImg_scaling);
subplot(223)
imshow(lapImg_scaling);
title('拉普拉斯滤波后的图像(已标定至[0,255])','fontsize',18);
dstImg = srcImg-lapImg;
dstImg = scale(dstImg);
dstImg = uint8(dstImg);
subplot(224)
imshow(dstImg);
title('目标图像','fontsize',18);
%% 函数定义:标定函数
function dstImg = scale(srcImg)
    MIN = min(srcImg(:));
    temp = srcImg-MIN;
    MAX = max(temp(:));
    dstImg = 255*temp/MAX;
end

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