風格化(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);
}

結果

這裏寫圖片描述
這裏寫圖片描述

更多閱讀

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

轉載請保留以下信息

作者 日期 聯繫方式
風吹夏天 2015年5月26日 [email protected]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章