拉普拉斯(laplacian)滤波实现图像锐化分析(负值处理方法)

先上个简单的示例,看MATLAB中拉普拉斯滤波器是如何实现的:

令原图f=magic(3)

f =
8 1 6
3 5 7
4 9 2

掩膜采用标准Laplacian掩膜:w=fspecial(‘laplacian’,0)

w =
0 1 0
1 -4 1
0 1 0

n=imfilter(f,w,‘replicate’);默认参数为’same’,结果为:

n =
-12 16 -4
8 0 -8
4 -16 12

采用’full’参数,n=imfilter(f,w,‘replicate’,‘full’);结果为:

n =
0 -7 12 -5 0
-5 -12 16 -4 1
6 8 0 -8 -6
-1 4 -16 12 5
0 5 -12 7 0

=========

实现过程:

①模板旋转180度(和原来一样,因为是对称的模板)

w’ =
0 1 0
1 -4 1
0 1 0

②图像边界填充,这里采用’replicate’方式:

k=padarray(m,[2 2],‘replicate’)
k =
8 8 8 1 6 6 6
8 8 8 1 6 6 6
8 8 8 1 6 6 6
3 3 3 5 7 7 7
4 4 4 9 2 2 2
4 4 4 9 2 2 2
4 4 4 9 2 2 2

(黄色背景为原始图像)

③进行卷积运算:
拉普拉斯(laplacian)滤波实现图像锐化分析(负值处理方法)_第1张图片
拉普拉斯(laplacian)滤波实现图像锐化分析(负值处理方法)_第2张图片

……(逐步计算,直至模板全部移过图像)

④去除边界,得到结果:
拉普拉斯(laplacian)滤波实现图像锐化分析(负值处理方法)_第3张图片
上述即用laplacian滤波模板进行图像滤波的过程(实际上是一个空间卷积操作)。

以一幅uint8类灰度图像为例,原图:
拉普拉斯(laplacian)滤波实现图像锐化分析(负值处理方法)_第4张图片

直接使用laplacian滤波模板滤波:

f=imread(‘moon.tif’);
w=fspecial(‘laplacian’,0)
g1=imfilter(f,w,‘replicate’);

imshow(g1)

拉普拉斯(laplacian)滤波实现图像锐化分析(负值处理方法)_第5张图片

效果并不理想,因为原图是一幅uint8类图像,输出结果仍为uint8类,所有像素均为正值,而拉普拉斯滤波模板中存在负值,变换结果中的所有负值被截掉了。
解决此问题,须先进行类型变换:

f2=im2double(f); %将f转换为归一化的double类图像

然后再进行滤波:

g2=imfilter(f2,w,‘replicate’);
imshow(g2,[])

拉普拉斯(laplacian)滤波实现图像锐化分析(负值处理方法)_第6张图片
此图像即含有负值的滤波结果,相比于原图,丢失了一些灰度色调,故还需用原图减去此滤波结果(以还原失去的灰度色调):

g=f2-g2;figure,imshow(g)
拉普拉斯(laplacian)滤波实现图像锐化分析(负值处理方法)_第7张图片

比原图清晰了很多。

另外,使用考虑了对角线元素的中心为8的拉普拉斯算子还可以获得更为清晰的图像:

w8=[1 1 1;1 -8 1;1 1 1]

w8 =
1 1 1
1 -8 1
1 1 1

g8=f-imfilter(f,w8,‘replicate’);
figure,imshow(g8)

拉普拉斯(laplacian)滤波实现图像锐化分析(负值处理方法)_第8张图片

===========

拉普拉斯算子的数学定义:
拉普拉斯(laplacian)滤波实现图像锐化分析(负值处理方法)_第9张图片
式(2)为式(1)的数字近似,式(3)中g(x,y)为目标图像,f(x,y)为原始图像。c为1(当掩膜中心系数为正时),c为-1(当掩膜中心系数为负时)
由于laplacian算子是微分操作符,所以它会使图像锐化,并使常量区域为0。

主要注意以下几点:
1.拉普拉斯微分处理后,有些点像素值为负值,所以有第30行的对sum值的判断和修改。如果没有这句,得到的微分后的图像中有很多白点。

2.拉普拉斯算子处理后的图像要和原图像相加,可以复原背景特性并保持拉普拉斯瑞华处理的效果。如果所使用的模板中心是负数,那么必须将原图像减去经拉普拉斯变换后的图像。如果像我这里使用的模板中心是正数,那么就将原图像加上经过拉普拉斯变换后的图像。

3.经拉普拉斯变换处理后的图像与原图像对应灰度相加,有可能超过最大灰度级255,所以代码31行加了相应的判断。如果没有这个判断,得到的图像看起来更像是平滑过而不是锐化过的。

void MainWindow::on_action_laplace_triggered()
{
    //image_png指向原图像
    width = image_png.width();
    height = image_png.height();
    int muban[3][3] = {0,-1,0,-1,4,-1,0,-1,0};
    
    //grayImg保存锐化后的结果
    grayImg = QImage(width,height,QImage::Format_RGB888);

    for(int i=0;i < width;i++)
    {
        for(int j =0;j < height;j ++)
        {
            int sum = 0;
            
            //对每一个像素使用模板
            for(int m = i-1;m <= i+1;m++)
            {
                for(int n = j-1;n <= j+1;n++)
                {
                    //边界点像素为0,所以对应相乘时不加和
                    if(m>=0&&n>=0&&m= 0)?sum:0;
            sum = (sum+ogray>255)?255:sum+ogray;

            //这里只实现了灰度图像,所以RGB值相等。
            grayImg.setPixel(i,j,qRgb(sum,sum,sum));
        }
    }
    update();
}

拉普拉斯(laplacian)滤波实现图像锐化分析(负值处理方法)_第10张图片

转:
https://www.cnblogs.com/DemonEdge/archive/2013/11/12/3419002.html
https://blog.csdn.net/scottly1/article/details/44408343

你可能感兴趣的:(图像处理,图像锐化,拉普拉斯,滤波)