您的位置:首页 > 其它

图像处理(三)——中国传统工艺画风格的图像转换应用

2015-11-18 16:57 337 查看
[b]中国传统工艺画风格的图像转换应用[/b]

1. 项目介绍

  希望做一个应用,输入为普通RGB或HSI图像,输出为带有中国特色的蛋壳粘贴画。使用的技术有Matlab、superpixel算法等。

  

%======================================================================
% 此函数将图像分为超像素块,块儿内颜色取值一样,为之前块儿内颜色的均值
%======================================================================
function imgout=myslic_function2(imgin, number_of_sp, compactness_factor)

imgout = imgin;
[m,n] = size(imgin);
n=n/3;

[labels, numlabels] = slicmex(imgin,number_of_sp,compactness_factor);%numlabels is the same as number of superpixels

imgin = int32(imgin);
labelstmp = labels;
% 以下所有代码是将RGB图像的三个通道,以labels为模板,分别求每个超像素内颜色的均值。
img = imgin(:,:,1);
img1 = img;
for i = 1 : m
for j = 1 : n
if (labelstmp(i, j) >= 0)
current = labelstmp(i, j);
sums = 0;
count = 0;
%average= 0;
% 找到一个块,计算块儿内颜色的均值
for ii = 1 : m
for jj = 1 : n
if (labelstmp(ii, jj) == current)
sums = sums + img(ii, jj);
count = count + 1;
end
end
end
average = sums / count;
% 将块儿内颜色设为均值
for ii = 1 : m
for jj = 1 : n
if (labelstmp(ii, jj) == current)
img1(ii, jj) = average;
labelstmp(ii, jj) = -1;
end
end
end
end
end
end
imgout(:,:,1) = img1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
labelstmp = labels;
img = imgin(:,:,2);
img1 = img;
for i = 1 : m
for j = 1 : n
if (labelstmp(i, j) >= 0)
current = labelstmp(i, j);
sums = 0;
count = 0;
%average= 0;
% 找到一个块,计算块儿内颜色的均值
for ii = 1 : m
for jj = 1 : n
if (labelstmp(ii, jj) == current)
sums = sums + img(ii, jj);
count = count + 1;
end
end
end
average = sums / count;
% 将块儿内颜色设为均值
for ii = 1 : m
for jj = 1 : n
if (labelstmp(ii, jj) == current)
img1(ii, jj) = average;
labelstmp(ii, jj) = -1;
end
end
end
end
end
end
imgout(:,:,2) = img1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
labelstmp = labels;
img = imgin(:,:,3);
img1 = img;
for i = 1 : m
for j = 1 : n
if (labelstmp(i, j) >= 0)
current = labelstmp(i, j);
sums = 0;
count = 0;
%average= 0;
% 找到一个块,计算块儿内颜色的均值
for ii = 1 : m
for jj = 1 : n
if (labelstmp(ii, jj) == current)
sums = sums + img(ii, jj);
count = count + 1;
end
end
end
average = sums / count;
% 将块儿内颜色设为均值
for ii = 1 : m
for jj = 1 : n
if (labelstmp(ii, jj) == current)
img1(ii, jj) = average;
labelstmp(ii, jj) = -1;
end
end
end
end
end
end
imgout(:,:,3) = img1;


View Code
  myslic_function2函数的效果为:


  上面原图为img,myslic_function2函数处理过的图为img2,其关系为

    img2 = myslic_function2(img, 1000, 100);

myslic_function2函数接受3个参数,分别是原图、结果想要的超像素的个数、Compactness factor(值越大超像素块儿边界越光滑)。

  要想获得蛋壳粘贴画的效果,还应在超像素块儿间加上裂纹,当然裂纹也通过对slic算法的结果进行再处理产生。

  产生裂纹的代码段:

img = imread('06.jpg');
edgeline = rgb2gray(img);

[labels, numlabels] = slicmex(img, 1000, 100);
[m,n]=size(labels);
for ii = 2 : m-1
for jj = 2 : n-1
if (labels(ii, jj) == labels(ii-1, jj)&&labels(ii, jj) == labels(ii+1, jj)&&labels(ii, jj) == labels(ii, jj-1)&&labels(ii, jj) == labels(ii, jj+1) )
edgeline(ii, jj)=0;
else
edgeline(ii, jj)=255;
end
end
end

% 对已经产生的裂纹进行高斯滤波,之后再进行阈值过滤
sigma = 1.3;
gausFilter = fspecial('gaussian',[5 5],sigma);
edgeline=imfilter(edgeline,gausFilter,'replicate');

edgeline(edgeline>100) = 255;
edgeline(edgeline<=100) = 0;

figure(3);
imshow(edgeline);


  产生的裂纹效果:



  最后,将产生裂纹加在经过myslic_function2函数处理后的图片上,代码如下:

img2(:,:,1)=img2(:,:,1) - edgeline;
img2(:,:,2)=img2(:,:,2) - edgeline;
img2(:,:,3)=img2(:,:,3) - edgeline;


  最后的结果:

  


  挺萌的还。附项目目录下载。其中image_shade1.m是运行的图形界面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: