PS 濾鏡演算法— — 表面模糊
阿新 • • 發佈:2019-02-20
影象的表面模糊處理,其作用是在保留影象邊緣的情況下,對影象的表面進行模糊處理。在對人物面板處理上,比高斯模糊更有效。因為高斯模糊在使人物面板光潔的同時,也將一些邊緣特徵如臉部的眉毛、嘴脣等給模糊了,不得不用蒙版小心的抹去這些地方的模糊部分。
在處理手法上,表面模糊也與其它卷積處理手段不同,如高斯模糊等在處理影象時都是採用統一的卷積矩陣進行,而表面模糊卻是每一個畫素點都有自己的卷積矩陣,而且還是3(4)套,用以對應於畫素的R、G、B(A、R、G、B)分量。所以表面模糊在程式設計處理時,比其它卷積操作更復雜、更耗時,因為它要對每一個畫素計算自己的卷積矩陣。表面模糊程式設計的難點也在計算卷積矩陣上,其它與一般影象卷積處理一樣。
表面模糊處理有2個引數,即模糊半徑和模糊閾值,前者確定模糊的範圍,後者確定模糊的程度。模糊範圍就是卷積矩陣大小,如模糊半徑為1,則模糊矩陣直徑為
矩陣元素值的計算公式為:
其中,
根據卷積運算,每一個畫素通過表面模糊之後的值為:
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
原圖:
效果圖: