图像的表面模糊处理,其作用是在保留图像边缘的情况下,对图像的表面进行模糊处理。在对人物皮肤处理上,比高斯模糊更有效。因为高斯模糊在使人物皮肤光洁的同时,也将一些边缘特征如脸部的眉毛、嘴唇等给模糊了,不得不用蒙版小心的抹去这些地方的模糊部分。

在处理手法上,表面模糊也与其它卷积处理手段不同,如高斯模糊等在处理图像时都是采用统一的卷积矩阵进行,而表面模糊却是每一个像素点都有自己的卷积矩阵,而且还是3(4)套,用以对应于像素的R、G、B(A、R、G、B)分量。所以表面模糊在编程处理时,比其它卷积操作更复杂、更耗时,因为它要对每一个像素计算自己的卷积矩阵。表面模糊编程的难点也在计算卷积矩阵上,其它与一般图像卷积处理一样。

表面模糊处理有2个参数,即模糊半径和模糊阈值,前者确定模糊的范围,后者确定模糊的程度。模糊范围就是卷积矩阵大小,如模糊半径为1,则模糊矩阵直径为 1×2+1=3,矩阵元素个数为3×3=9,矩阵的中间元素即是当前像素点。

矩阵元素值的计算公式为:

wij=1(|IijI0|)2.5T

其中,T 是阈值,wij 是模板矩阵的元素值,也可以称为权重, Iij 是图像值, I0 是模板矩阵中心的图像值。一般来说,wij 会做一个预处理:

wij=max(0,wij)

根据卷积运算,每一个像素通过表面模糊之后的值为:

Inew=wijIijwij

clc;
clear all;
close all;

addpath('E:\Visual Effects\PS Algorithm');

Img=imread('1.jpg');
Img=double(Img);
imshow(Img/255);

img_out=Img;

R=Img(:, :, 1);
G=Img(:, :, 2);
B=Img(:, :, 3);

radi=5;
thre=25;

img_out(:, :, 1)=Surface_Blur(R, radi, thre);
img_out(:, :, 2)=Surface_Blur(G, radi, thre);
img_out(:, :, 3)=Surface_Blur(B, radi, thre);

figure, imshow(img_out/255);


%% surface blur

function I_out=Surface_Blur(I_in, radi, thre)


[r, c]=size(I_in);

I_out=I_in;


for ii=1+radi : r-radi
    for jj=1+radi : c-radi

            patch=I_in (ii-radi:ii+radi, jj-radi:jj+radi);

            p0=I_in(ii, jj);

            mask_1= repmat(p0, 2*radi+1, 2*radi+1);

            mask_2=1-abs(patch-mask_1)/(2.5*thre);

            mask_3=max(mask_2, 0);

            I_out(ii, jj)=sum(sum(patch.*mask_3))/sum(mask_3(:));

    end    
end

原图:

这里写图片描述

效果图:

这里写图片描述

posted on 2016-10-14 20:57  未雨愁眸  阅读(839)  评论(0编辑  收藏  举报