OpenCV 2.4.3 C++ 平滑處理分析
原理
平滑也稱模糊, 是一項(xiàng)簡單且使用頻率很高的圖像處理方法。
平滑處理時需要用到一個濾波器。 最常用的濾波器是線性濾波器,線性濾波處理的輸出像素值(例如:)是輸入像素值(例如:
)的加權(quán)平均:
稱為核, 它僅僅是一個加權(quán)系數(shù)。
均值平滑
下面是一個使用blur函數(shù)的均值平滑:
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <stdio.h>
using namespace cv;
int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);
if( argc != 2 || !image.data ){
printf("沒有圖片\n");
return -1;
}
namedWindow( "平滑處理-輸入" );
namedWindow( "平滑處理-輸出" );
imshow( "平滑處理-輸入", image );
Mat out;
blur( image, out, Size(3, 3));
imshow( "平滑處理-輸出", out );
waitKey( 0 );
}
使用歸一化塊濾波器進(jìn)行模糊圖片操作。
C++: void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )該函數(shù)對圖片進(jìn)行平滑處理利用了下面的內(nèi)核:
調(diào)用blur(src, dst, ksize, anchor, borderType)相當(dāng)于調(diào)用boxFilter(src, dst, src.type(), anchor, true, borderType)。
blur使用的是歸一化塊濾波器,輸出像素值是核窗口內(nèi)像素值的均值( 所有像素加權(quán)系數(shù)相等)。
高斯平滑
下面代碼使用了GaussianBlur來實(shí)現(xiàn)平滑:
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <stdio.h>
using namespace std;
using namespace cv;int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);
if( argc != 2 || !image.data ){
printf("沒有圖片\n");
return -1;
}
namedWindow( "平滑處理-輸入" );
namedWindow( "平滑處理-輸出" );
imshow( "平滑處理-輸入", image );
Mat out;
GaussianBlur( image, out, Size( 3, 3 ), 0, 0 );
imshow( "平滑處理-輸出", out );
waitKey( 0 );
}
GaussianBlur函數(shù)API資料:
使用高斯濾波器進(jìn)行模糊操作
C++: void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)最有用的濾波器 (盡管不是最快的)。 高斯濾波是將輸入數(shù)組的每一個像素點(diǎn)與高斯內(nèi)核卷積將卷積和當(dāng)作輸出像素值。
參考一維高斯函數(shù),我們可以看見,他是個中間大兩邊小的函數(shù)。
所以高斯濾波器其加權(quán)數(shù)是中間大,四周小的。
其二維高斯函數(shù)為:
其中 為均值 (峰值對應(yīng)位置),
代表標(biāo)準(zhǔn)差 (變量
和 變量
各有一個均值,也各有一個標(biāo)準(zhǔn)差)。
中值平滑
使用medianBlur執(zhí)行中值平滑:
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <stdio.h>
using namespace std;
using namespace cv;int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);
if( argc != 2 || !image.data ){
printf("沒有圖片\n");
return -1;
}
namedWindow( "平滑處理-輸入" );
namedWindow( "平滑處理-輸出" );
imshow( "平滑處理-輸入", image );
Mat out;
medianBlur( image, out, 3);
imshow( "平滑處理-輸出", out );
waitKey( 0 );
}
medianBlur函數(shù)API資料:
使用中值濾波器進(jìn)行模糊操作
C++: void medianBlur(InputArray src, OutputArray dst, int ksize)中值濾波將圖像的每個像素用鄰域 (以當(dāng)前像素為中心的正方形區(qū)域)像素的中值代替 。
雙邊平滑
使用bilateralFilter執(zhí)行雙邊平滑:
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <stdio.h>
using namespace std;
using namespace cv;int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);
if( argc != 2 || !image.data ){
printf("沒有圖片\n");
return -1;
}
namedWindow( "平滑處理-輸入" );
namedWindow( "平滑處理-輸出" );
imshow( "平滑處理-輸入", image );
Mat out;
bilateralFilter ( image, out, 3, 3*2, 3/2 );
imshow( "平滑處理-輸出", out );
waitKey( 0 );
}
bilateralFilter的API資料:
對一個圖片應(yīng)用雙邊濾波器。
C++: void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, intborderType=BORDER_DEFAULT )原理可參考:
http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html
目前我們了解的濾波器都是為了平滑圖像, 問題是有些時候這些濾波器不僅僅削弱了噪聲, 連帶著把邊緣也給磨掉了。 為避免這樣的情形 (至少在一定程度上 ), 我們可以使用雙邊濾波。
類似于高斯濾波器,雙邊濾波器也給每一個鄰域像素分配一個加權(quán)系數(shù)。 這些加權(quán)系數(shù)包含兩個部分, 第一部分加權(quán)方式與高斯濾波一樣,第二部分的權(quán)重則取決于該鄰域像素與當(dāng)前像素的灰度差值。
相關(guān)文章
C語言深入淺出講解直接插入排序算法的實(shí)現(xiàn)
插入排序也是最簡單的一類排序方法,我今天介紹的也是插入排序里最直觀且淺顯易懂的直接插入排序。對這個很簡單的排序,記得當(dāng)時也是花了近兩個晚上才搞懂它的原理的,接下來就來介紹一下2022-05-05C++實(shí)現(xiàn)拼圖游戲代碼(graphics圖形庫)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)拼圖游戲代碼,帶有g(shù)raphics圖形庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05Opencv 視頻轉(zhuǎn)為圖像序列的實(shí)現(xiàn)
今天小編就為大家分享一篇Opencv 視頻轉(zhuǎn)為圖像序列的實(shí)現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12C語言中建立和刪除文件連接的相關(guān)函數(shù)講解
這篇文章主要介紹了C語言中建立和刪除文件連接的相關(guān)函數(shù)講解,分別為link和unlink函數(shù)的使用,需要的朋友可以參考下2015-09-09C/C++產(chǎn)生隨機(jī)數(shù)函數(shù)簡單介紹
這篇文章主要為大家詳細(xì)介紹了C/C++產(chǎn)生隨機(jī)數(shù)函數(shù)的實(shí)現(xiàn)方法,如何使用C/C++產(chǎn)生隨機(jī)數(shù)函數(shù),感興趣的小伙伴們可以參考一下2016-04-04string中c_str(),data(),copy(p,n)函數(shù)的用法總結(jié)
以下是對string中c_str(),data(),copy(p,n)函數(shù)的用法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下2013-09-09C語言根據(jù)協(xié)議分割獲取字符串單元的實(shí)現(xiàn)代碼
今天小編就為大家分享一篇關(guān)于C語言根據(jù)協(xié)議分割獲取字符串單元的實(shí)現(xiàn)代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12VisualStudio2022打包項(xiàng)目文件為.exe安裝包
本文主要介紹了VisualStudio2022打包項(xiàng)目文件為.exe安裝包,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07