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

文章目录


前言

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


一、高斯滤波

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

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

对于灰度图像,首先读入带有名字字样图片,然后将图片处理为灰度图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)<x2(i,j)              
               w(i,j)=x1(i,j);
            else
               w(i,j)=x2(i,j); 
            end
        end
    end
    
end

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

三、RGB图像

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

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

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

通道分离时,将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)<x2(i,j,k)              
                    w(i,j,k)=x1(i,j,k);
                 else
                    w(i,j,k)=x2(i,j,k); 
                 end
           
            end
        end
    
    end
end

三通道融合效果图:

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

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图像软阴影效果图如下:

最后附上实现RGB图像软阴影效果完整代码:

% RGB图像软阴影效果
clear;clc;

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;

figure(1);
subplot 131;imshow(channel1_1);title('原图R通道');
subplot 132;imshow(channel1_2);title('原图G通道');
subplot 133;imshow(channel1_3);title('原图B通道');

sigma = 10; % 高斯正态分布标准差
Kernal1 = fspecial('gaussian',[11 11],sigma); % 高斯滤波
p2 = imfilter(p1, Kernal1, 'replicate'); 
se=translate(strel(1),[15 15]); % 向右下各平移15个像素
p3 =imdilate(p2,se);

channel3_1=p3;
channel3_2=p3;
channel3_3=p3;
% 第一幅图的G B通道的灰度值全部变成0 这样就只有R通道的了
channel3_1(:,:,2)=0;
channel3_1(:,:,3)=0;

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

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

figure(2);
subplot 131;imshow(channel3_1);title('滤波、平移后图像R通道');
subplot 132;imshow(channel3_2);title('滤波、平移后图像G通道');
subplot 133;imshow(channel3_3);title('滤波、平移后图像B通道');

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通道');
figure(4);
subplot 121;imshow(p1);title('原图');
subplot 122;imshow(p2);title('高斯滤波后图像');
figure(5);
subplot 111;imshow(p4);title('软阴影效果图'); 

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)<x2(i,j,k) 
w(i,j,k)=x1(i,j,k);
else
w(i,j,k)=x2(i,j,k); 
end
end
end
end
end

 总结

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

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值