风格化(Stylization)

引言

风格化的目的是生成绘画或印象派的效果,而不注重写实。事实上,保边去噪的滤波器是风格化的理想选择,因为它可以抽象区域的同时,保持,或增强边缘特性。
给定一个输入图像,滤波后的图像叠加与之对应梯度图像,增强了图像边缘信息,产生了像铅笔画一样的非真实绘制。

步骤

  1. 读入图像
  2. 保边滤波得到一副图层
  3. 滤波后图像的梯度,得到另外一幅图层
  4. 叠加两幅图层

代码

Matlab版

% clear all;
close all;
clc;

% (a) Input photograph
I = imread('5.jpg');
I = im2double(I);

%% Stylization Examples sigma_s = 12; sigma_r = 0.5; % (b) Filtered with NC (σs=100, σr=0.45).
F_nc = NC(I, sigma_s, sigma_r);

F_gray = rgb2gray(F_nc);
% (c)Edges from the gradient magnitude of (b).
F_edge = imgradient(F_gray);


% (d) Stylized using (b) and (c).
Stylized  = bsxfun(@minus,F_nc,F_edge);

% Show results.
figure, imshow(I); title('Input photograph');
figure, imshow(F_nc); title('Filtered photograph');
figure, imshow(Stylized); title('Stylized');

openCV 3.0中photo模块下面npr.cpp也有相应的源代码:

void cv::stylization(InputArray _src, OutputArray _dst, float sigma_s, float sigma_r)
{
    Mat I = _src.getMat();
    _dst.create(I.size(), CV_8UC3);
    Mat dst = _dst.getMat();

    Mat img = Mat(I.size(),CV_32FC3);
    I.convertTo(img,CV_32FC3,1.0/255.0);

    int h = img.size().height;
    int w = img.size().width;

    Mat res = Mat(h,w,CV_32FC3);
    Mat magnitude = Mat(h,w,CV_32FC1);

    Domain_Filter obj;
    obj.filter(img, res, sigma_s, sigma_r, NORMCONV_FILTER);

    obj.find_magnitude(res,magnitude);

    Mat stylized = Mat(h,w,CV_32FC3);

    vector <Mat> temp;
    split(res,temp);
    multiply(temp[0],magnitude,temp[0]);
    multiply(temp[1],magnitude,temp[1]);
    multiply(temp[2],magnitude,temp[2]);
    merge(temp,stylized);

    stylized.convertTo(dst,CV_8UC3,255);
}

结果

风格化(Stylization)_第1张图片
风格化(Stylization)_第2张图片

更多阅读

http://www.inf.ufrgs.br/~eslgastal/DomainTransform/ (Domain Transform for Edge-Aware Image and Video Processing)

转载请保留以下信息

作者 日期 联系方式
风吹夏天 2015年5月26日 [email protected]

你可能感兴趣的:(ad,BF,非真实绘制,图像风格化)