1. 程式人生 > >PS 濾鏡演算法— — 表面模糊

PS 濾鏡演算法— — 表面模糊

影象的表面模糊處理,其作用是在保留影象邊緣的情況下,對影象的表面進行模糊處理。在對人物面板處理上,比高斯模糊更有效。因為高斯模糊在使人物面板光潔的同時,也將一些邊緣特徵如臉部的眉毛、嘴脣等給模糊了,不得不用蒙版小心的抹去這些地方的模糊部分。

在處理手法上,表面模糊也與其它卷積處理手段不同,如高斯模糊等在處理影象時都是採用統一的卷積矩陣進行,而表面模糊卻是每一個畫素點都有自己的卷積矩陣,而且還是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

原圖:

這裡寫圖片描述

效果圖:

這裡寫圖片描述