文章目錄
- 1.高斯模糊
- 1.什么是高斯模糊
- 2.opencv提供的API
- 2.雙邊模糊
- 1.什么是雙邊模糊
- 2.opencv的API
- 3.磨皮美顏效果的實作
- 1.實作程序
- 2.主要代碼
- 3.效果
參考博客:
高斯模糊(高斯濾波)的原理與演算法_lsh呵呵-CSDN博客_高斯濾波的基本原理
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.效果
原圖:

磨皮后:

(邊緣資訊沒有損失,但是色塊更加均勻了還是)
源自一張網圖,誰不喜歡好看的小姐姐呢嘿嘿
最后真的想吐槽一下csdn的圖片插入功能,我只能QQ截圖復制,都不是原圖就比較無語哎,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/395269.html
標籤:其他
