引言
风格化的目的是生成绘画或印象派的效果,而不注重写实。事实上,保边去噪的滤波器是风格化的理想选择,因为它可以抽象区域的同时,保持,或增强边缘特性。
给定一个输入图像,滤波后的图像叠加与之对应梯度图像,增强了图像边缘信息,产生了像铅笔画一样的非真实绘制。
步骤
- 读入图像
- 保边滤波得到一副图层
- 滤波后图像的梯度,得到另外一幅图层
- 叠加两幅图层
代码
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 = zeros(size(I,1),size(I,2),3);
Stylized(:,:,1) = F_nc(:,:,1) - F_edge;
Stylized(:,:,2) = F_nc(:,:,2) - F_edge;
Stylized(:,:,3) = F_nc(:,:,3) - 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] |
时间: 2024-10-10 00:50:42