OpenCV利用高斯模糊實(shí)現(xiàn)簡(jiǎn)單的磨皮美顏效果
1.高斯模糊
1.什么是高斯模糊
前面我們就知道了均值模糊和中值模糊,現(xiàn)在我們開(kāi)始了解高斯模糊。
首先高斯指的是高斯函數(shù),這個(gè)我想大家應(yīng)該都知道,是一種非常常見(jiàn)的概率分布函數(shù)。大概就長(zhǎng)這樣吧。

通過(guò)均值模糊類比,我們可以大膽的猜出來(lái)高斯模糊的含義:
每一次需要處理的像素矩陣中不同地方的像素的值在最后的賦值像素的占比是不一樣的。這個(gè)占比是按照高斯函數(shù)所分布的。
也就是說(shuō),越是遠(yuǎn)離中心像素的像素所占比重就更少,而中心像素值在賦值像素中的比重是最重的。
或者說(shuō),我們知道之前均值模糊所乘以的矩陣是

而高斯模糊中所乘的3*3矩陣可以是這樣的

可視化后就是這樣的

雖然我們可以從數(shù)學(xué)上得知高斯模糊和均值模糊的區(qū)別,但是在效果上我個(gè)人覺(jué)得高斯模糊可能能比起均值模糊能更好的保留邊緣信息(只是個(gè)人看法)
最后把高斯模糊的計(jì)算公式提供給數(shù)學(xué)大佬

2.opencv提供的API
GaussianBlur(Mat src, Mat dst, Size(11, 11), sigmax, sigmay);
其中Size(x, y), x, y 必須是正數(shù)而且是奇數(shù)
參數(shù)SigmaX表示高斯方程中X方向的標(biāo)準(zhǔn)方差
參數(shù)SigmaY表示高斯方程中X方向的標(biāo)準(zhǔn)方差
在高斯分布中,方差可以理解為這個(gè)高斯分布的平緩程度,也就是說(shuō)中間值所占比重的大小,方差越小,中間值所占比重越大,此時(shí)模糊的效果會(huì)相對(duì)更低一點(diǎn)(在同一個(gè)size下)
可視化一下你會(huì)乘的矩陣:
當(dāng)方差較大時(shí):

方差較小時(shí):

這里兩幅圖不是完全合適,只是類比
2.雙邊模糊
1.什么是雙邊模糊
由于考慮到不管是均值模糊或者高斯模糊,最后的效果都是整個(gè)圖像的模糊。有時(shí)候我們無(wú)需整體的模糊,而比如只模糊邊緣,或者只模糊細(xì)節(jié)。
而雙邊模糊便是實(shí)現(xiàn)了對(duì)邊緣信息的保留而弱化了細(xì)節(jié)。(這個(gè)效果可以用來(lái)磨皮,可以想想為啥)
實(shí)現(xiàn)的原理是我們確定一個(gè)數(shù)表示兩個(gè)像素之間的差值的閾值,一旦兩個(gè)像素之間超過(guò)了這個(gè)閾值,那么就不對(duì)這兩個(gè)像素進(jìn)行高斯模糊處理,一旦沒(méi)有超過(guò),就進(jìn)行模糊處理。因?yàn)檫吘壍貐^(qū)的像素差值是比較大的,這樣就能保留邊緣的信息。
2.opencv的API
bilateralFilter(src, dest, d=15, 150, 3);
15 –計(jì)算的半徑,半徑之內(nèi)的像數(shù)都會(huì)被納入計(jì)算,如果提供-1 則根據(jù)sigma space參數(shù)取值
150 – sigma color 決定多少差值之內(nèi)的像素會(huì)被計(jì)算
3 – sigma space 如果d的值大于0則聲明無(wú)效,否則根據(jù)它來(lái)計(jì)算d值
3.磨皮美顏效果的實(shí)現(xiàn)
1.實(shí)現(xiàn)過(guò)程
通過(guò)對(duì)雙邊模糊處理后的圖像再進(jìn)行對(duì)比度加深的操作,最后就是讓模糊的邊緣再進(jìn)行加深,幾乎回到原來(lái)的效果。而模糊效果去掉皮膚上的細(xì)節(jié),從而可以讓皮膚顯得光滑并且顏色很有光澤。
并且我利用滑軌可以動(dòng)態(tài)臺(tái)哦姐雙邊模糊的閾值從而讓你們自己控制磨皮的效果。
2.主要代碼
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
string path = "xxxxxxxxxxxx.jpg";
Mat img = imread(path);
Mat img2 = Mat::zeros(img.size(), img.type());
Mat img3;
Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
imshow("img1", img);
int x = 1, y = 1;
namedWindow("Trackbars", (10, 100));//新建了一個(gè)窗口--軌跡欄
createTrackbar("x", "Trackbars", &x, 200);
while (1)
{
bilateralFilter(img,img2,15,x,3);
imshow("img2", img2);
filter2D(img2, img3, img.depth(), kernel);//src.depth()表示位圖深度,和type相關(guān)
imshow("img3", img3);
waitKey(10);
}
waitKey(0);
return 0;
}
3.效果
原圖:

磨皮后:

(邊緣信息沒(méi)有損失,但是色塊更加均勻了還是)?
到此這篇關(guān)于OpenCV利用高斯模糊實(shí)現(xiàn)簡(jiǎn)單的磨皮美顏效果的文章就介紹到這了,更多相關(guān)OpenCV磨皮效果內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++文件關(guān)鍵詞快速定位出現(xiàn)的行號(hào)實(shí)現(xiàn)高效搜索
這篇文章主要為大家介紹了C++文件關(guān)鍵詞快速定位出現(xiàn)的行號(hào)實(shí)現(xiàn)高效搜索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
C++實(shí)現(xiàn)LeetCode(107.二叉樹(shù)層序遍歷之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(107.二叉樹(shù)層序遍歷之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
c++函數(shù)中的指針參數(shù)與地址參數(shù)區(qū)別介紹
c++函數(shù)中的指針參數(shù)與地址參數(shù)區(qū)別介紹;可供參考2012-11-11
用C編寫(xiě)一個(gè)送給女朋友的情人節(jié)小程序 可愛(ài)!
非??蓯?ài)的情人節(jié)小程序!文章為大家分享了用C編寫(xiě)一個(gè)送給女朋友的小程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
C++有限狀態(tài)機(jī)實(shí)現(xiàn)計(jì)算器小程序
這篇文章主要為大家詳細(xì)介紹了C++有限狀態(tài)機(jī)實(shí)現(xiàn)計(jì)算器小程序的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
c語(yǔ)言實(shí)現(xiàn)MD5算法的項(xiàng)目實(shí)踐
MD5用于確保信息傳輸完整一致,是計(jì)算機(jī)廣泛使用的雜湊算法之一,本文主要介紹了c語(yǔ)言實(shí)現(xiàn)MD5算法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08

