赞
踩
PC机、matlab2018b
拉普拉斯算子是图像邻域内像素灰度差分计算的基础,通过二阶微分推导出的一种图像邻域增强算法。它的基本思想是当邻域的中心像素灰度低于它所在邻域内的其他像素的平均灰度时,此中心像素的灰度应该进一步降低;当高于时进一步提高中心像素的灰度,从而实现图像锐化处理。
在算法实现过程中,通过对邻域中心像素的四方向或八方向求梯度,并将梯度和相加来判断中心像素灰度与邻域内其他像素灰度的关系,并用梯度运算的结果对像素灰度进行调整。
一个连续的二元函数f(x,y),其拉普拉斯运算定义为:
▽ 2 f = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 (3.1) \triangledown ^{2} f= \frac{\partial ^{2}f}{\partial x^{2}} + \frac{\partial^{2}f}{\partial y^{2}} \tag{3.1} ▽2f=∂x2∂2f+∂y2∂2f(3.1)
在x方向上,我们有
∂
2
f
∂
x
2
=
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
−
2
f
(
x
,
y
)
(3.2)
\frac{\partial ^{2}f}{\partial x^{2}} = f(x + 1, y) + f(x - 1,y) - 2f(x, y) \tag{3.2}
∂x2∂2f=f(x+1,y)+f(x−1,y)−2f(x,y)(3.2)
在y方向上,我们有
∂
2
f
∂
y
2
=
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
−
2
f
(
x
,
y
)
(3.3)
\frac{\partial ^{2}f}{\partial y^{2}} = f(x, y + 1) + f(x, y - 1) - 2f(x, y) \tag{3.3}
∂y2∂2f=f(x,y+1)+f(x,y−1)−2f(x,y)(3.3)
遵循这三个公式,两个变量的离散拉普拉斯算子是
▽
2
f
(
x
,
y
)
=
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
+
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
−
4
f
(
x
,
y
)
(3.4)
\triangledown ^{2} f(x, y)= f(x + 1, y) + f(x - 1,y) + f(x, y + 1) + f(x, y - 1) - 4f(x, y) \tag{3.4}
▽2f(x,y)=f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y−1)−4f(x,y)(3.4)
由于拉普拉斯是一种微分算子,因此其应用强调的是图像中灰度的突变,并不强调灰度级缓慢变化的区域。这将产生把浅灰色边线和突变点叠加到暗色背景中的图像。将原图像和拉普拉斯图像叠加在一起的简单方法,可以复原背景特性并保持拉普拉斯锐化处理的效果。正如上一段中讲到的那样,记住所使用的拉普拉斯定义是很重要的。如果所使用的定义具有负的中心系数,那么必须将原图像减去经拉普拉斯变换后的图像而不是加上它,从而得到锐化结果。所以,我们使用拉普拉斯对图像增强的基本方法可表示为下式:
g
(
x
,
y
)
=
f
(
x
,
y
)
+
c
[
▽
2
f
(
x
,
y
)
]
(3.5)
g(x, y) = f(x, y) + c \left [ \triangledown ^{2}f(x, y) \right ] \tag{3.5}
g(x,y)=f(x,y)+c[▽2f(x,y)](3.5)
其中, f ( x , y ) f(x,y) f(x,y)和 g ( x , y ) g(x,y) g(x,y)分别是输入图像和锐化后的图像。常用拉普拉斯滤波器如下图所示:
|
|
编程实现图像拉普拉斯锐化。
选用图片如下图所示:
(1)读取图像,记为img:使用imread函数将图像读入Matlab;
(2)将图像转为double类型;
(3)获取图像大小m,n;
(4)定义模板1为[0,1,0;1,-4,1;0,1,0],模板2为[1,1,1;1,-8,1;1,1,1];
(5)遍历图像,对图像使用模板1。得到的矩阵数值有正有负,将负值置为0,不进行标定,记为img1,可得如下图像:
对图像进行标定,对数值使用mat2gray()函数映射到[0,1],再使用im2uint8()函数将数值转为uint8类型,数值映射到[0,255],图像如下图所示:
(6)遍历图像,对图像使用模板2。得到的矩阵数值有正有负,将负值置为0,不进行标定,记为img2;
(7)对两个模板处理的图片使用公式3.5,c=-1,可得图像如下图所示:
在图3-4中由于拉普拉斯图像中既有正值又有负值,并且所有负值在显示时都修剪为0,所以图像的大部分是黑色的。
对图像进行标定,对它的最小值加一个新的代替0的最小值,然后将结果标定到整个灰度范围[0,L-1]内,图3-4中的黑色背景由于标定现在已变成灰色如图3-5所示。
图3-6中的第二幅图像显示了使用模板1的滤波器在c=-1时使用式3.5得到的结果。该图像的细节比原图像更清晰。将原图像加到拉普拉斯的处理结果中,可以使图像中的各灰度值得到复原,而且通过拉普拉斯增强了图像中灰度突变处的对比度。最终结果是使图像中的细节部分得到了增强,并良好地保留了图像的背景色调。
图3-6中的第三幅图像显示了使用模板2中的滤波器重复前述过程处理的结果。
图3-6中的第二幅图像的清晰度的重要改进,因为使用了图模板1的滤波器导致在对角方向上产生了额外的区别(锐化)。
function img_2 = ex3_MyFilter_1(img,template,out_type) % 返回均值滤波后的图像矩阵 % img:原图像,template:模板,out_type:输出类型,该值为0时输出标定数据,为1输出未标定数据,为2输出滤波后未做处理数据 % 转为double类型 img_1 = im2double(img); % 获取模板大小 [m,n] = size(template); % 获取图像大小,且hight>n,width>n [height, width] = size(img_1); % 创建一个新的图像矩阵 img_2 = img_1; % 使用模板对图像进行处理 for i=1:height - m + 1 for j=1:width - n + 1 % c=img_1(i : i + (m - 1),j : j + (n - 1)) .* template; %取出x1中从(i,j)开始的m行n列元素与模板相乘 s=sum(sum(c)); %求c矩阵中各元素之和 img_2(i + (m - 1) / 2,j + (n - 1) / 2) = s; %将与模板运算后的各元素的均值赋给模板中心位置的元素 end end % 标定 if out_type == 0 img_2 = im2uint8(mat2gray(img_2)); % 不标定 elseif out_type == 1 for i = 1:m for j = 1:n if img_2(i,j) < 0 img_2(i,j) = 0; end end end img_2 = im2uint8(img_2); % 不做处理 elseif out_type == 2 img_2 = img_2; end
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。