一、高斯模糊
1.高斯濾波原理
圖像處理中,高斯濾波主要可以使用兩種方法實現(xiàn)。一種是離散化窗口滑窗卷積,另一種方法是通過傅里葉變化。離散化窗口劃船卷積時主要利用的是高斯核,高斯核的大小為奇數(shù),因為高斯卷積會在其覆蓋區(qū)域的中心輸出結(jié)果。常用的高斯模板有如下幾種形式:
高斯模板是通過高斯函數(shù)計算出來的,公式如下:
從以上描述中我們可以看出,高斯濾波模板中最重要的參數(shù)就是高斯分布的標(biāo)準(zhǔn)差σ。它代表著數(shù)據(jù)的離散程度,如果σ較小,那么生成的模板中心系數(shù)越大,而周圍的系數(shù)越小,這樣對圖像的平滑效果就不是很明顯;相反,σ較大時,則生成的模板的各個系數(shù)相差就不是很大,比較類似于均值模板,對圖像的平滑效果就比較明顯。
2.GaussianBlur函數(shù)
(1)函數(shù)原型:
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT)
參數(shù)詳解如下:
src,輸入圖像,即源圖像,填Mat類的對象即可。它可以是單獨的任意通道數(shù)的圖片,但需要注意,圖片深度應(yīng)該為CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
dst,即目標(biāo)圖像,需要和源圖片有一樣的尺寸和類型。比如可以用Mat::Clone,以源圖片為模板,來初始化得到如假包換的目標(biāo)圖。
ksize,高斯內(nèi)核的大小。其中ksize.width和ksize.height可以不同,但他們都必須為正數(shù)和奇數(shù)。或者,它們可以是零的,它們都是由sigma計算而來。若(blur1,blur2)為高斯核的大小,blur1和blur2的值可以不同。參數(shù)0表示標(biāo)準(zhǔn)差取0。當(dāng)blur1=blur2=1時,相當(dāng)于不對原始圖像做操作。**blur1和blur2越大,圖像的模糊程度越大。**但不是blur1和blur2越大越好,blur1和blur2太大,不僅會濾除噪音,還會平滑掉圖像中有用的信息。所以blur的選取要進(jìn)行測試。如果要進(jìn)行濾波的圖像的長寬比大致為1:1,那么選取blur時,一般設(shè)置blur1=blur2。如果要進(jìn)行濾波的圖像的長寬比大致為m:n,那么選取blur時,blur1:blur2=m:n
sigmaX,表示高斯核函數(shù)在X方向的的標(biāo)準(zhǔn)偏差。
sigmaY,表示高斯核函數(shù)在Y方向的的標(biāo)準(zhǔn)偏差。
sigma和窗口大小size是互相推算出來的。如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height計算出來。如果設(shè)置size,那么sigma不起作用;如果設(shè)置size(0,0),那么通過sigma就能調(diào)節(jié)模糊效果。只設(shè)置sigmaX,不設(shè)置sigmaY那么默認(rèn)sigmaY=sigmaX。
(2)調(diào)節(jié)delta參數(shù)
利用TrackBar調(diào)節(jié)delta參數(shù)
#include <iostream>
#include "opencv2\opencv.hpp"
using namespace std;
using namespace cv;
int delta1;
int delta2;
Mat src;
Mat dst;
Mat gray;
Mat gauss_mat;
Mat binary;
Mat canny;
void gauss(int b, void* userdata) {
cvtColor(src, gray, COLOR_BGR2GRAY); //轉(zhuǎn)化成灰度圖
GaussianBlur(gray, gauss_mat, Size(1, 1), delta1, delta2); //平滑濾波
//threshold(gauss_mat, binary, 10, 255, THRESH_BINARY | THRESH_OTSU); //自適應(yīng)二值化
//Canny(binary, canny, 20, 80, 3);
imshow("gauss", gauss_mat);
}
int main() {
src = imread("coin.jpg");
namedWindow("gauss", WINDOW_NORMAL);
//調(diào)節(jié)GaussianBlur的delta
createTrackbar("gaussbar", "gauss", &delta1, 50, gauss, 0);//調(diào)節(jié)delta時不能為0,否則報異常。如果Size不為(0,0),調(diào)節(jié)delta沒有任何作用。
createTrackbar("gaussbar", "gauss", &delta2, 50, gauss, 0);
waitKey(0);
}
(3)應(yīng)用例子
//高斯模糊,中心占得比重最大
void QuickDemo::gaussian_blur_demo(Mat &image) {
Mat dst;
GaussianBlur(image, dst, Size(0, 0), 100);//卷積核大小必須是奇數(shù),sigma和窗口大小是互相推算出來的。如果設(shè)置size,那么sigma不起作用;如果設(shè)置size(0,0),那么通過sigma就能調(diào)節(jié)模糊效果。
imshow("高斯模糊", dst);
}
#include <QCoreApplication>
#include "opencv2/opencv.hpp"
using namespace cv;
int main(int argc, char *argv[])
{
cv::Mat input;
input = cv::imread("test1.png");
cv::Mat org = input.clone();
cv::namedWindow("input", WINDOW_NORMAL);
cv::imshow("input", input);
//GaussianBlur
for (size_t i = 0; i < blur_times; ++i)
cv::GaussianBlur(org, org, cv::Size(5, 5), 0, 0);
cv::namedWindow("GaussianBlur", WINDOW_NORMAL);
cv::imshow("GaussianBlur", org);
cv::waitKey(0);
}
參考:https://aistudio.csdn.net/62e38a51cd38997446774bd7.html?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2defaultOPENSEARCHactivity-1-81568844-blog-105547468.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultOPENSEARCHactivity-1-81568844-blog-105547468.pc_relevant_3mothn_strategy_recovery&utm_relevant_index=2
參考:https://blog.csdn.net/qq_38132105/article/details/105547468
二、高斯雙邊模糊
相比于高斯模糊,高斯雙邊模糊會保存圖片的細(xì)節(jié)特征文章來源:http://www.zghlxwxcb.cn/news/detail-465836.html
void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, douboe sigmaSpace, int borderType=BORDER_DEFAULT)
高斯雙邊濾波既考慮了像素位置對原來像素的影響,也考慮了像素值的原來坐標(biāo)點的影響。位置越遠(yuǎn)影響越小,像素相差越多影響越小。
第四個參數(shù):double類型的sigmaColor,顏色空間濾波器的sigma值。這個值越大,表示該像素鄰域內(nèi)有越寬廣的顏色被混合到一起,會產(chǎn)生較大的半相等顏色區(qū)域。
第五個參數(shù):double類型的sigmaSpace,坐標(biāo)空間中濾波器的sigma值,坐標(biāo)空間的標(biāo)準(zhǔn)方差。它的值越大,則越遠(yuǎn)的像素會相互影響,從而使更大的區(qū)域中足夠相似的顏色獲取相同的顏色。當(dāng)d>0時,d指定了鄰域大小且與sigmaSpace無關(guān)。fouze,d正比于sigmaSpace。文章來源地址http://www.zghlxwxcb.cn/news/detail-465836.html
void QuickDemo::bifilter_demo(Mat &image) {
Mat dst;
bilateralFilter(image, dst, 0, 10, 20);
imshow("雙邊模糊", dst);
}
到了這里,關(guān)于OpenCV圖像模糊:高斯濾波、雙邊濾波的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!