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

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

表面模糊处理有2个参数,即模糊半径和模糊阈值,前者确定模糊的范围,后者确定模糊的程度。模糊范围就是卷积矩阵大小,如模糊半径为1,则模糊矩阵直径为 1×2+1=3 <script type="math/tex" id="MathJax-Element-25">1 \times 2+1=3</script>,矩阵元素个数为 3×3=9 <script type="math/tex" id="MathJax-Element-26">3 \times 3=9</script>,矩阵的中间元素即是当前像素点。

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

wij=1(|IijI0|)2.5T
<script type="math/tex; mode=display" id="MathJax-Element-294"> w_{ij}=1-\frac{(|I_{ij}-I_{0}|)}{2.5T} </script>

其中, T <script type="math/tex" id="MathJax-Element-295">T</script> 是阈值,wij<script type="math/tex" id="MathJax-Element-296">w_{ij}</script> 是模板矩阵的元素值,也可以称为权重, Iij <script type="math/tex" id="MathJax-Element-297">I_{ij}</script> 是图像值, I0 <script type="math/tex" id="MathJax-Element-298">I_{0}</script> 是模板矩阵中心的图像值。一般来说, wij <script type="math/tex" id="MathJax-Element-299">w_{ij}</script> 会做一个预处理:

wij=max(0,wij)
<script type="math/tex; mode=display" id="MathJax-Element-311"> w_{ij}=max(0, w_{ij}) </script>

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

Inew=wijIijwij
<script type="math/tex; mode=display" id="MathJax-Element-351"> I_{new}=\frac{\sum w_{ij}I_{ij}}{\sum w_{ij}} </script>

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

原图:

这里写图片描述

效果图:

这里写图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐