MATLAB实现图像软阴影效果(高斯滤波)

文章目录

  • 目录

    文章目录

    前言

    一、高斯滤波

    二、图片融合

    三、RGB图像


前言

通过对图片进行高斯滤波,然后再与原图像进行融合,实现图像的软阴影效果。


一、高斯滤波

高斯滤波的含义:高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。

高斯滤波的作用:高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。

对于灰度图像,首先读入带有名字字样图片,然后将图片处理为灰度图gray,再将灰度图进行高斯滤波操作,得到滤波后的图像G,再将滤波后的图像向右下方向各平移15个像素距离,最后将灰度图与平移后的图像进行融合,融合方法是比对两张图片同样像素点的灰度值,灰度值取小融合。即可得到软阴影效果。其中高斯滤波和尺寸为11*11,正态分布标准差为10。

代码如下:

首先对将图像转换为灰度图像

x1=imread('MATLAB.png');   % 读入图片
M = size(x1);

if numel(M)>2             % 转换为灰度图
    gray = rgb2gray(x1);
else
    gray = x1;
end

然后对灰度图像进行高斯滤波

sigma = 15;                                     % 高斯正态分布标准差
Kernal1 = fspecial('gaussian',[15 15],sigma);   % 高斯滤波核 11*11
G = imfilter(gray, Kernal1, 'replicate');       % G为滤波后图像

原图与经过高斯滤波后的图像对比,直观来看经过高斯滤波后的图像有些模糊,使像素间灰度值过度更平滑。

二、图片融合

若产生软阴影效果,需要原图与滤波后图像叠加时错开一段像素距离,可将滤波后图像向右下方向平移一段距离,或者向其他方向平移,可呈现出不同的软阴影效果。

将原图与高斯滤波后的图像错位融合

se=translate(strel(1),[15 15]);                 % 向右下各平移15个像素
x2=imdilate(G,se);                              % 将滤波后图像进行平移

像素取小融合,即对比两张图片相同像素点的灰度值,选取较小的灰度值作为融合图片在该位置的灰度值,由于本次设计采用白底黑字的图片,所以为了保持白底,融合时字体保留较小值(较黑的部分),融合函数如下,在主程序中调用即可。若读者们想像素值选大融合,将条件语句中的小于号改为大于等于即可。

function w=fmaxmin(x1,x2)
    x1=double(x1);
    x2=double(x2);
    [m,n]=size(x1);
    
    for i=1:m                    %基于像素值选小的简单图像融合方法
        for j=1:n
            if x1(i,j)

最后融合后的软阴影效果如下图所示:

MATLAB实现图像软阴影效果(高斯滤波)_第1张图片

三、RGB图像

在上述中处理灰度图中仅有一个通道,在图像处理中无需考虑三通道间的相互影响,而在RGB图像中,如果向灰度图像一样直接处理,在融合过程中无法识别较小的灰度值,三个通道的灰度值会相互影响,所以RGB图像的软阴影效果需要逐通道处理。

可将原图和高斯滤波后的图像的三通道分别分离出来,再将相对应的通道进行融合,融合好的三个通道再进行合并,即可得到最后结果。

RGB图像软阴影效果处理流程图:

MATLAB实现图像软阴影效果(高斯滤波)_第2张图片

通道分离时,将G、B通道灰度值置零即可得到R通道的图像,同理可得G、B通道。下面以原图的三通道分离为例,经过高斯滤波后的图像三通道分离痛的可得,读者可自行编写:

p1=imread('matlab_rgb.png');

channel1_1=p1;
channel1_2=p1;
channel1_3=p1;
% G B通道的灰度值全部变成0 即可得到R通道图像
channel1_1(:,:,2)=0;
channel1_1(:,:,3)=0;

channel1_2(:,:,1)=0;
channel1_2(:,:,3)=0;

channel1_3(:,:,1)=0;
channel1_3(:,:,2)=0;

图像滤波和平移可参考灰度图的处理方法,不用分离三通道即可完成。

图像融合时仍采用灰度值取小融合,与灰度图不同的是,应注意融合图像的数据类型,灰度图的类型为double型,而RGB融合的图像数据类型为unit8,否则会输出灰度图像。

function w=fmaxmin(x1,x2)
    x1=uint8(x1);
    x2=uint8(x2);
    [m,n,o]=size(x1);
    
    for i=1:m                    %基于像素值选小的简单图像融合方法
        for j=1:n
            for k=1:o
                 if x1(i,j,k)

三通道融合效果图:

MATLAB实现图像软阴影效果(高斯滤波)_第3张图片

最后将融合的三通道进行合并。

chaanel2_1=fmaxmin(channel1_1,channel3_1);
chaanel2_2=fmaxmin(channel1_2,channel3_2);
chaanel2_3=fmaxmin(channel1_3,channel3_3);

p4(:,:,1)=chaanel2_1(:,:,1);
p4(:,:,2)=chaanel2_2(:,:,2);
p4(:,:,3)=chaanel2_3(:,:,3);

figure(3);
subplot 131;imshow(chaanel2_1);title('软阴影图像R通道');
subplot 132;imshow(chaanel2_2);title('软阴影图像G通道');
subplot 133;imshow(chaanel2_3);title('软阴影图像B通道');

RGB图像软阴影效果图如下:

MATLAB实现图像软阴影效果(高斯滤波)_第4张图片


 总结

以上是本人初学图像处理心得,欢迎交流指正!

文中代码方法分别取自:http://t.csdn.cn/xYCGe

http://t.csdn.cn/GSI4a

http://t.csdn.cn/BvaNs​​​​​​​

你可能感兴趣的:(matlab)