Python實(shí)現(xiàn)在線批量美顏功能過程解析
結(jié)果

然后直接放源碼:
import cv2 as cv
source = cv.imread("zhaopian.jpg")
dst = cv.bilateralFilter(src=source, d=0, sigmaColor=30, sigmaSpace=15)
cv.imshow("source", source)
cv.imshow("dst", dst)
cv.waitKey()
cv.destroyAllWindows()
好了,本文結(jié)果部分介紹結(jié)束,想進(jìn)一步了解一下原理的同學(xué)可以接著往下看了,沒啥興趣的可以左上角了。
雙邊濾波原理
上面的圖片美顏效果其實(shí)使用的是 OpenCV 中為我們提供的雙邊濾波器,是一種圖片降噪算法。
雙邊濾波(Bilateral filter)是一種非線性的濾波方法,本質(zhì)是基于高斯濾波。
前面的文章介紹過,高斯濾波的方式會(huì)造成邊緣模糊化,這是沒辦法的事情,這是高斯濾波過濾方式而導(dǎo)致的。
而雙邊濾波就是在高斯濾波的基礎(chǔ)上,對(duì)高斯濾波的方式加以改進(jìn),結(jié)合圖像的空間鄰近度和像素值相似度的一種折處理,同時(shí)考慮 空域信息(domain) 和 值域信息(range) ,達(dá)到保邊降噪的目的。
說人話就是雙邊濾波在進(jìn)行濾波的過程中,不光要考慮周圍像素值與中點(diǎn)像素值的大小之差,還需要考慮空間上的距離,進(jìn)而確定該點(diǎn)對(duì)中間點(diǎn)的影響因子。
比如在一張圖像中,相鄰的像素點(diǎn)的顏色會(huì)非常相近,但是如果在邊緣區(qū)域,相鄰元素點(diǎn)的顏色變化會(huì)非常的大。
高斯過濾器的過濾過程中就是因?yàn)闆]有考慮邊緣區(qū)域而導(dǎo)致過濾后圖像邊緣模糊,而雙邊濾波由于在過濾的過程中考慮到了周圍像素值與中點(diǎn)像素值的差值大小,從而會(huì)確定一個(gè)影響因子,從而實(shí)現(xiàn)圖片的保邊降噪。
具體的實(shí)現(xiàn)原理如下:
希望你們的高中數(shù)學(xué)沒有都還給你們的數(shù)學(xué)老師
整個(gè)雙邊濾波的算法分為兩部分,一個(gè)是顏色值的相似度(值域核),公式如下:
$$
r(i, j, k, l) = exp( - \frac{||f(i, j) − f(k, l)||2}{2{\sigma2_r}} )
$$
另一個(gè)是計(jì)算空間距離的相似度(空域核),也就是說,離得越近,相似度越高,公式如下:
$$
d(i, j, k, l)=exp( - \frac{(i−k)^2 + (j−l)2}{2{\sigma2_d}})
$$
上面的邏輯還是很清晰,千萬不要被一堆符號(hào)弄暈了。
這里 (i, j) 代表的是要處理的像素點(diǎn)的坐標(biāo)點(diǎn),而 (k,l) 則是要處理的范圍內(nèi),可能影響到其值的像素點(diǎn)的坐標(biāo)。
最終的權(quán)重系數(shù) w(i,j,k,l) 取決于空域核和值域核的乘積,公式如下:
$$
w(i,j,k,l)=d(i,j,k,l) ∗ r(i,j,k,l) = exp( - \frac{(i−k)^2 + (j−l)2}{2{\sigma2_d}} - \frac{||f(i, j) − f(k, l)||2}{2{\sigma2_r}})
$$
下面是一個(gè)經(jīng)典的雙邊濾波的原理示意圖:

從這個(gè)圖中可以看出,在圖(b)空域核上,每個(gè)像素的權(quán)重是符合高斯分布的,而在圖(c)的值域核上,由于像素取值相差過大,不同顏色的權(quán)重系數(shù)相差也很大,雙邊過濾過濾完成后,邊緣兩側(cè)的像素點(diǎn)保留了原有的色彩值。
接下來還是看下雙邊濾波的原函數(shù):
def bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
- src:原圖
- d:像素鄰域的直徑。如果這個(gè)值設(shè)為非正數(shù),那么 OpenCV 會(huì)從第五個(gè)參數(shù) sigmaSpace 來將它計(jì)算出來。
- sigmaColor:顏色空間濾波器的 $\sigma$ 值。這個(gè)參數(shù)的值越大,就表明該像素鄰域內(nèi)有更寬廣的顏色會(huì)被混合到一起,產(chǎn)生較大的半相等顏色區(qū)域。
- sigmaSpace:坐標(biāo)空間中濾波器的 $\sigma$ 值,坐標(biāo)空間的標(biāo)注方差。他的數(shù)值越大,意味著越遠(yuǎn)的像素會(huì)相互影響,從而使更大的區(qū)域足夠相似的顏色獲取相同的顏色。當(dāng) d > 0 , d 指定了鄰域大小且與 sigmaSpace 無關(guān)。否則, d 正比于 sigmaSpace 。使用過程中我發(fā)現(xiàn)這個(gè)值越大,圖像的過渡效果越好。
源代碼我就不放了,實(shí)際上只有那一行代碼,不過希望看到本文的各位除了知道雙邊濾波能對(duì)圖像進(jìn)行美顏以外還是能稍微了解下原理。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python 判斷字符串中是否含有漢字或非漢字的實(shí)例
今天小編就為大家分享一篇python 判斷字符串中是否含有漢字或非漢字的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07
matplotlib自定義鼠標(biāo)光標(biāo)坐標(biāo)格式的實(shí)現(xiàn)
這篇文章主要介紹了matplotlib自定義鼠標(biāo)光標(biāo)坐標(biāo)格式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Pycharm沒有報(bào)錯(cuò)提示(誤觸ignore)的完美解決方案
這篇文章主要介紹了Pycharm沒有報(bào)錯(cuò)提示(誤觸ignore)的解決方案,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
Python用SSH連接到網(wǎng)絡(luò)設(shè)備
這篇文章主要介紹了Python用SSH連接到網(wǎng)絡(luò)設(shè)備,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-02-02
超詳細(xì)OpenMV與STM32單片機(jī)通信 附完整源碼
這篇文章主要介紹了OpenMV與STM32單片機(jī)通信的相關(guān)知識(shí),在文章結(jié)尾給大家提供了項(xiàng)目源碼,需要的朋友可以參考下2021-11-11
Python+unittest+requests 接口自動(dòng)化測(cè)試框架搭建教程
這篇文章主要介紹了Python+unittest+requests 接口自動(dòng)化測(cè)試框架搭建教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
使用Python實(shí)現(xiàn)一鍵往Word文檔的表格中填寫數(shù)據(jù)
在工作中,我們經(jīng)常遇到將Excel表中的部分信息填寫到Word文檔的對(duì)應(yīng)表格中,以生成報(bào)告,方便打印,所以本文小編就給大家介紹了如何使用Python實(shí)現(xiàn)一鍵往Word文檔的表格中填寫數(shù)據(jù),文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2023-12-12
python selenium自動(dòng)上傳有贊單號(hào)的操作方法
這篇文章主要介紹了python selenium自動(dòng)上傳有贊單號(hào)的操作代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07

