MATLAB对RGB彩色图像进行加马赛克处理

简单实现MATLAB对RGB彩色图像进行加马赛克处理

为了加深对图像中像素块操作的记忆,利用像素块内均值方式对RGB彩色图像进行马赛克效果的处理;为了能后比较简单得实现,所以采用了n*n像素块大小的均值的方式。
为了比较简单实现,这里对RGB彩色图像三个通道分别采用了相同的均值操作,最后再利用MATLAB中的cat()函数将其合成三通道彩色图像。
代码如下:

%图片加马赛克练习
%均值处理方式加马赛克
%参数说明:f表示原图;fr,fg,fb表示原图的RGB三个通道
%imgn表示新图像
%imgnr,imgng,imgnb表示新图像的三个通道,分别用于存储新的图像
%n*n表示设置的马赛克区域像素块的大小

clear all;
close all;
clc;
%原图的路径
f = imread('F:\MATLAB2017b\MOutputResults\saber7.jpg');

%将源图像三个通道值取出
fr = f(:,:,1);
fg = f(:,:,2);
fb = f(:,:,3);
%由于原图像是三维h*w*3,求出单通道图像的大小
[h w] = size(fr);

%设置三个零矩阵用于存储新图像
imgnr = zeros(h,w);
imgng = zeros(h,w);
imgnb = zeros(h,w);

%设置马赛克区域n*n像素块大小
n = 20;
nh = floor(h/n)*n;%将不一定是n的整数倍的图像大小化为整数倍
nw = floor(w/n)*n;

%对R通道进行处理

for j = 1:n:nh
    for i = 1:n:nw
        imgnr(j:j+n-1, i:i+n-1) =mean(mean(fr(j:j+n-1, i:i+n-1)));%对列进行取均值处理
    end
    imgnr(j:j+n-1,nw:w ) = mean(mean(fr(j:j+n-1,nw:w )));%处理最后的列
end
for i = 1:n:nw
    imgnr(nh:h, i:i+n-1) = mean(mean(fr(nh:h, i:i+n-1)));%处理最后的行
end
imgnr(nh:h, nw:w) = mean(mean(fr(nh:h, nw:w)));%处理最后的角
 
%处理G通道
for j = 1:n:nh
    for i = 1:n:nw
        imgng(j:j+n-1, i:i+n-1) =mean(mean(fg(j:j+n-1, i:i+n-1))); 
    end
    imgng(j:j+n-1, nw:w) = mean(mean(fg(j:j+n-1, nw:w)));
end
for i = 1:n:nw
    imgng(nh:h, i:i+n-1) = mean(mean(fg(nh:h, i:i+n-1)));
end
imgng(nh:h, nw:w) = mean(mean(fg(nh:h, nw:w)));

%处理B通道
for j = 1:n:nh
    for i = 1:n:nw
        imgnb(j:j+n-1, i:i+n-1) = mean(mean(fb(j:j+n-1, i:i+n-1)));
    end
    imgnb(j:j+n-1, nw:w) = mean(mean(fb(j:j+n-1, nw:w)));
end
for i = 1:n:nw
    imgnb(nh:h,i:i+n-1) = mean(mean(fb(nh:h, i:i+n-1)));
end
imgnb(nh:h, nw:w) = mean(mean(fb(nh:h, nw:w)));

%三通道图像合成
imgnr = im2double(imgnr)/255;
imgng = im2double(imgng)/255;
imgnb = im2double(imgnb)/255;
imgn = cat(3,imgnr, imgng, imgnb);
imshowpair(f,imgn,'montage');%两张图片显示
title('原图                                                  马赛克处理后图像');

效果如下:

saber
由于实际上对RGB每个通道的处理操作都是一样的,因此还可以将原图三个通道的过程写成一个for循环。
代码为:

clear all;
close all;
clc;
%原图的路径
f = imread('F:\MATLAB2017b\MOutputResults\saber7.jpg');

% %将源图像单个通道值取出
fr = f(:,:,1);
[h w] = size(fr);
imgn = f;

%设置马赛克区域n*n像素块大小
n = 20;
nh = floor(h/n)*n;%将不一定是n的整数倍的图像大小化为整数倍
nw = floor(w/n)*n;

%对三个通道进行循环处理
for t = 1:3
    for j = 1:n:nh
        for i = 1:n:nw
            imgn(j:j+n-1, i:i+n-1, t) =mean(mean(f(j:j+n-1, i:i+n-1, t)));%对列进行取均值处理
        end
        imgn(j:j+n-1,nw:w , t ) = mean(mean(f(j:j+n-1,nw:w , t)));%处理最后的列
    end
    for i = 1:n:nw
        imgn(nh:h, i:i+n-1, t) = mean(mean(f(nh:h, i:i+n-1, t)));%处理最后的行
    end
    imgn(nh:h, nw:w, t) = mean(mean(f(nh:h, nw:w , t)));%处理最后的角
    
end

imshowpair(f,imgn,'montage');%两张图片显示
title('原图                                                  马赛克处理后图像');

最后运行结果一样。

  • 20
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值