OpenCV利用高斯模糊實現簡單的磨皮美顏效果

1.高斯模糊

1.什麼是高斯模糊

前面我們就知道瞭均值模糊和中值模糊,現在我們開始瞭解高斯模糊。

首先高斯指的是高斯函數,這個我想大傢應該都知道,是一種非常常見的概率分佈函數。大概就長這樣吧。

通過均值模糊類比,我們可以大膽的猜出來高斯模糊的含義:

每一次需要處理的像素矩陣中不同地方的像素的值在最後的賦值像素的占比是不一樣的。這個占比是按照高斯函數所分佈的。

也就是說,越是遠離中心像素的像素所占比重就更少,而中心像素值在賦值像素中的比重是最重的。

或者說,我們知道之前均值模糊所乘以的矩陣是

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

可視化後就是這樣的

雖然我們可以從數學上得知高斯模糊和均值模糊的區別,但是在效果上我個人覺得高斯模糊可能能比起均值模糊能更好的保留邊緣信息(隻是個人看法)

最後把高斯模糊的計算公式提供給數學大佬

2.opencv提供的API

GaussianBlur(Mat src, Mat dst, Size(11, 11), sigmax, sigmay);

其中Size(x, y), x, y 必須是正數而且是奇數

參數SigmaX表示高斯方程中X方向的標準方差

參數SigmaY表示高斯方程中X方向的標準方差

在高斯分佈中,方差可以理解為這個高斯分佈的平緩程度,也就是說中間值所占比重的大小,方差越小,中間值所占比重越大,此時模糊的效果會相對更低一點(在同一個size下)

可視化一下你會乘的矩陣:

當方差較大時:

方差較小時:

這裡兩幅圖不是完全合適,隻是類比

2.雙邊模糊

1.什麼是雙邊模糊

由於考慮到不管是均值模糊或者高斯模糊,最後的效果都是整個圖像的模糊。有時候我們無需整體的模糊,而比如隻模糊邊緣,或者隻模糊細節。

而雙邊模糊便是實現瞭對邊緣信息的保留而弱化瞭細節。(這個效果可以用來磨皮,可以想想為啥)

實現的原理是我們確定一個數表示兩個像素之間的差值的閾值,一旦兩個像素之間超過瞭這個閾值,那麼就不對這兩個像素進行高斯模糊處理,一旦沒有超過,就進行模糊處理。因為邊緣地區的像素差值是比較大的,這樣就能保留邊緣的信息。

2.opencv的API

bilateralFilter(src, dest, d=15, 150, 3);

15 –計算的半徑,半徑之內的像數都會被納入計算,如果提供-1 則根據sigma space參數取值

150 – sigma color 決定多少差值之內的像素會被計算

3 – sigma space 如果d的值大於0則聲明無效,否則根據它來計算d值

3.磨皮美顏效果的實現

1.實現過程

通過對雙邊模糊處理後的圖像再進行對比度加深的操作,最後就是讓模糊的邊緣再進行加深,幾乎回到原來的效果。而模糊效果去掉皮膚上的細節,從而可以讓皮膚顯得光滑並且顏色很有光澤。

並且我利用滑軌可以動態臺哦姐雙邊模糊的閾值從而讓你們自己控制磨皮的效果。

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));//新建瞭一個窗口--軌跡欄
	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相關
		imshow("img3", img3);
		waitKey(10); 
	}
	waitKey(0);
	return 0;
}

3.效果

原圖:

磨皮後:

(邊緣信息沒有損失,但是色塊更加均勻瞭還是) 

到此這篇關於OpenCV利用高斯模糊實現簡單的磨皮美顏效果的文章就介紹到這瞭,更多相關OpenCV磨皮效果內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: