曾经十分羡慕别人的手绘、简笔画风格的头像,尝试画过,奈何手残没能实现。上课看到书里的图像增强中的锐化图像和二值图像,感觉这种效果再稍改进些差不多就是我想要的那种,于是有了这个设计。
第一种方法 灰度图像边缘检测方法
直接上代码
manhuahua.m
close all;clear all;clc;
f = imread(‘C:\Users\12555\Desktop\shuzi\lenna.jpg’);
[VG,A,PPG] = colorgrad(f);
ppg = im2uint8(PPG);
ppgf = 255 - ppg;
[M,N] = size(ppgf);
T=150;
ppgf1 = zeros(M,N);
for ii = 1:M
for jj = 1:N
if ppgf(ii,jj)
ppgf1(ii,jj)=(T-ppgf1(ii,jj))/5;
else %平滑区域
ppgf1(ii,jj)=235/(255-T)*(ppgf(ii,jj)-T);
end
end
end
ppgf1 = uint8(ppgf1);
figure;
subplot(221);imshow(ppgf);
subplot(223);imshow(ppgf1);
subplot(222);imhist(ppgf);
subplot(224);imhist(ppgf1);
%figure;imshow(ppgf1);
第二种方法 彩色图像边缘检测
shouhui.m
%单线条效果
handles.pic=imread(‘C:\Users\12555\Desktop\shuzi\41.jpg’);
%figure,imshow(handles.pic);title(‘原图效果’);
handles.pic=rgb2gray(handles.pic);
%figure,imshow(handles.pic);title(‘灰度效果’);
bw=edge(handles.pic,‘canny’);%数字图像轮廓提取
se = strel(‘line’,3,0);%创建直线长度3角度为0形态学元素
bwd=imdilate(bw,se);%对图像实施膨胀操作
%figure,imshow(bw);title(‘单线条效果’);
%figure,imshow(bwd);title(‘单线条效果’);
%matlab实现油画,浮雕,伪色彩,底片,单线条效果程序。
%下载http://www.wenkuxiazai.com/doc/515b31260722192e4536f64b-10.html
d=imcomplement(bw);
d1=imcomplement(bwd);
figure
subplot(121);imshow(d);
subplot(122);imshow(d1);
title(‘白底黑线图像’)
colorgrad.m
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(2gxy./(gxx-gyy+eps)));
G1 = 0.5((gxx+gyy) + (gxx-gyy).cos(2A) + 2*gxy.sin(2A));
A = A + pi/2;
G2 = 0.5*((gxx+gyy) + (gxx-gyy).cos(2A) + 2*gxy.sin(2A));
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
自觉效果已经很好了。
原始图片来源于微博,侵删。
参考文献为贾永红的数字图像处理(第三版)和冈萨瓦斯的数字图像处理。