利用Matlab将图片转换成素描(简笔画)风格

原文链接:http://blog.csdn.net/jbb0523/article/details/45565293
  记得曾经看过别人的网络头像,是那种类似简笔画或素描的图片,一直以来都想做一个类似的头像,但始终不得要领。今天当我看到文献[1]中的图5.28时(第151-152页),我感觉那种效果类似于我想要的,于是就看了一下,写了一段程序,主要是用了文献[1]中的colorgrad函数。如果要想看懂这段程序还是得有一定的数字图像处理基础。

  处理程序:

close all;clear all;clc;  
f = imread('zhaomin2.jpg');  
[VG,A,PPG] = colorgrad(f);  
ppg = im2uint8(PPG);  
ppgf = 255 - ppg;  
[M,N] = size(ppgf);T=200;  
ppgf1 = zeros(M,N);  
for ii = 1:M  
    for jj = 1:N  
        if ppgf(ii,jj)<T  
            ppgf1(ii,jj)=0;  
        else  
            ppgf1(ii,jj)=235/(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);  
subplot(224);imhist(ppgf1);  

figure;imshow(ppgf1); 

  大致的原理是先用colorgrad函数检测输入RGB图像的边缘(必须是RGB图片),得到RGB向量空间的梯度(图1左上角图像),但这个图像淡色太淡,从它的直方图(图1左下角,图像直方图概念可参见文献[1]第2.3节)可以看出大部分像素值都集中于靠近255(白色)一边,因此对它做一个灰度变换(可参见文献[1]第2.2节)。程序中的参数T需要根据实际图片去设置,如从图1中可以看出T大概取200左右,这个值可以多次尝试几个:(观察图1左下角的直方图,它是图1左上角图像的直方图)
这里写图片描述
  下面是colorgrad函数的原代码(文献[1]第337-338页):

function [VG, A, PPG] = colorgrad(f, T)  
if (ndims(f)~=3) || (size(f,3)~=3)  
    error('Input image must be RGB');  
end  
sh = fspecial('sobel');  
sv = sh';  
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');  

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  
    VG = (VG>T).*VG;  
    PPG = (PPG>T).*PPG;  
end  

  原图:
这里写图片描述
  效果图(即图1中右上角的图像):
这里写图片描述

  注意:如果你脸上有痣的话要用软件(如证照之星、美图秀秀等)把痣去掉,否则做出来的效果会是本来不太明显的痣却非常明显。

  文献[2][3][5]介绍了一种利用PhotoShop把图片转为素描(简笔画)风格的方法,曾学过一点photoshop,不过现在都忘干净了,电脑上早就不安装photoshop了,作为一个从事信号处理的人,应该用自己的方法去实现。以下给出两文献[4]和文献[5]中的效果图:

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值