(课后作业,搬运整合) matlab的图像风格化和在android 上的移植

 上课发现选的软件方向 竟然有一门数字图像处理的课程尴尬,然后反观这边的一些情况。还是选择了用简单的方法做点有趣的东西出来

可能制作和实现都比较简陋,但是也算自己这一段时间的劳动的总结吧,想想自己写写这些东西还是蛮带感的。

所以说开始吧,这边的所做的现在只有两个东西,边缘提取和对于原来的色彩的处理。

对应的做出了 类似彩色铅笔画和油画的效果图。

这边前面的工作主要参考了 这边的一个博主的文章  http://blog.csdn.net/jbb0523/article/details/45565293  借用希望别见怪

function [VG, A, PPG] = colorgrad(f, T)
%这边是图像处理程序的入口  输入为图像的一张3色表 单元数据为 3*unit8

%ndims是matlab中求一个数组维数的函数  这边表示后面一个的返回值可能是第三位的维度
%后面这一段尽然是正确的
if (ndims(f)~=3) || (size(f,3)~=3)
    error('Input image must be RGB');
end
% sh = fspecial('sobel');
sh=fspecial('laplacian');
%这边采取的是3*3的滤波器的使用 然后再转置对下面 y处理
sv = sh'; 
%图片处理分别对3个色度进行卷积
Rx = imfilter(double(f(:,:,1)), sh, 'replicate');
Ry = imfilter(double(f(:,:,1)), sv, 'replicate');
Gx = imfilter(double(f(:,:,2)), sh, 'replicate');
Gy = imfilter(double(f(:,:,2)), sv, 'replicate');
Bx = imfilter(double(f(:,:,3)), sh, 'replicate');
By = imfilter(double(f(:,:,3)), sv, 'replicate');

%对于这边的3个参数 用了平方的方式 取出的是总体的变化大小
%这段代码是对于下面的铺垫
gxx = Rx.^2 + Gx.^2 + Bx.^2; 
gyy = Ry.^2 + Gy.^2 + By.^2;
gxy = Rx.*Ry + Gx.*Gy + Bx.*By;

A = 0.5*(atan(2*gxy./(gxx-gyy+eps)));
G1 = 0.5*((gxx+gyy) + (gxx-gyy).*cos(2*A) + 2*gxy.*sin(2*A));
 
A = A + pi/2;
G2 = 0.5*((gxx+gyy) + (gxx-gyy).*cos(2*A) + 2*gxy.*sin(2*A));
G1 = G1.^0.5;
G2 = G2.^0.5;
VG = mat2gray(max(G1, G2));
 
RG = sqrt(Rx.^2 + Ry.^2);
GG = sqrt(Gx.^2 + Gy.^2);
BG = sqrt(Bx.^2 + By.^2);
 
PPG = mat2gray(RG + GG + BG);
 
if nargin ==2
    %判断语句大于1
    VG = (VG>T).*VG;
    PPG = (PPG>T).*PPG;
end
上面代码中可以改进的步骤主要有两个 ,一个是对于提取矩阵的改造,这边采用了实现的最常用的sobel算子,但是实际上算子的选择和图像的类型有很大的关系,具体来说就是用一个3*3矩阵对于图像取出梯度,你在二位的情况下可以选择用x方向和y方向。对于横向支线来说,当然只有你用y方向的梯度才可以取出边缘,以此类推。这边采用的  从中间来取出的话 f(x,y)=[f(x-1,y-1)-f(x,y)]+[f(x-1,y)-f(x,y)]其余6项。这边可以看成旁边颜色和中间样色的变化程度,当然色差/距离.。
1     2     1
0     0     0
  -1    -2    -1

这边的可以取出来的再加入自己的设定的阀值就是照片的边缘条件了。

对于这边的取值的方法其实有3个,加上灰度取边缘的话。    3种方式效果,和效率(一般情况下)的对比。   3色梯度>3色绝对值>灰度取边缘    效率基本相反。但是我们的一般处理的话使用3色的提取的效果几乎可以和第一种对比。


下一步是确定要改造的方式

1.模仿水彩的笔记 提取这边的边缘作为画稿的粗体的边框
然后把颜色的复杂度降低,使得在同一块的颜色有连续性,做出画笔的
笔迹。
(这边的梯度会造成 变化造成一些斑点之类的放大)
2.铅笔画的风格化,铅笔画的特点就是无法做到颜色涂抹,会使用纸张
本来的颜色 于是颜色会沿着线条往内慢慢的淡化,整体图像是白色为主
的。处理过的图像,反向转置再和原来的图像做叠加,使得在非边框位置
数据溢出。然后降低总体的亮度把颜色返回来。
(这边的处理使得原来的一些颜色丢失了)

然后是这边的主函数

close all;clear all;clc;
f = imread('F:\matlab\3.jpg');
%T 抽取直方图的临界值 大于不取点
%color 对于颜色抽取 没有256色劣化
%2为 数组为全2的倍数
%x 将这边的所有图像亮度再减小一点
T=200;
x=100;
color=32;
fu=rgb2gray(f);
sh=fspecial('laplacian');
sv = sh'; 
fux = imfilter(double(fu),sh, 'replicate');
fuy = imfilter(double(fu),sv, 'replicate');
fug=mat2gray(sqrt(fux.^2 +fuy.^2));
imshow(fug);


[VG,A,PPG] = colorgrad(f,0.1);
ppg = im2uint8(PPG);
ppgf =255-ppg;   
[M,N] = size(ppgf);
ppgf1 = zeros(M,N);
for ii = 1:M
    for jj = 1:N
        %T设置越小图像丢失越多
        if ppgf(ii,jj)<T
            ppgf1(ii,jj)=0;
        else
%把亮度小于200 的直接转换成黑色 并且把剩下的作拉升 从0到225 这边不取255 直方图会显得有质感
            ppgf1(ii,jj)=225/(255-T)*(ppgf(ii,jj)-T);
        end
    end
end

%第一组输出图 为原函数和直方图均衡后的直方图
ppgf1 = uint8(ppgf1);
%这边第一张图
figure;
subplot(221);imshow(ppgf);
subplot(222);imshow(ppgf1);
subplot(223);
imhist(ppgf);
%这边的白色会顶破天 所以加了坐标约束
axis([0 255 0 3000]);
subplot(224);
imhist(ppgf1);
axis([0 255 0 3000]);

%加上一个噪声
% sh = fspecial('gaussian',[1,1],0.5);
% ppgf2 = imfilter(double(ppgf1),sh, 'replicate');
% imshow(ppgf2)
% se = strel('disk',2);        
% ppgf2 = imdilate(ppgf1,se);
% imshow(ppgf2)
% se = strel('disk',1);        
% ppgf2 = imerode(ppgf1,se);
% imshow(ppgf2)


%对于颜色的劣化处理
a=f;
[row,tab,dom] = size(f);
for i=1:row
    for j=1:tab
        for k=[1,2,3]
          %将图像还原 到原来场景 类似黑色描边 彩色涂鸦
          %颜色数值/5 四舍五入*5 相当于5之间的变化没有了
      a(i,j,k)=(round(double(f(i,j,k))/color)*color/256*(double(ppgf1(i,j))));
%          a(i,j,k)=(round(double(f(i,j,k))/color)*color+double(ppgf1(i,j)-x));
        end
    end
end
figure;imshow(f);
figure;imshow(a);
figure;imshow(ppgf1);

      和上面博主的处理方法上做了自己的改造,然后提取了其中一些可以调节的单数进行自定义。具体流程基本为:获取梯度,设置阀值,边界获取。然后图像增强 对比度调节。获取外边框之后对于图像里面的颜色再做处理。

可以看到上面的 很多处理都是利用了matlab里面的数据类型转化过程的一些数值变化。 然后现在我们得到的是一个可以具有可调节参数的图像风格化matlab 程序。

可以看一些这边的效果图

  

这边的去噪声没有加所以会显得有点噪点 ,所以拍照的时候需要注意不要包含头发丝等小细节。

然后是对于android的移植。

这边的代码编写主要来自于手头上正在由的一个拍照demo来的所以不要吐槽界面  然后感谢github上分享予图像处理的那位兄弟。


这边的处理因为手机比较渣所以选取了计算量最小的灰度提取梯度方法  发现主代码有点长的说

假如可以接受长期等待 完全可以把这个的边缘做的更加细一点  

代码过长  ,有需要会上传网上。  

好的人生第一篇博文


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值