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('原图                                                  马赛克处理后图像');

最后运行结果一样。

发布了63 篇原创文章 · 获赞 101 · 访问量 10万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 像素格子 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览