最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

OpenCV 2.4.3 C++ 平滑處理分析

 更新時間:2012年11月21日 16:29:18   作者:  
平滑也稱模糊, 是一項簡單且使用頻率很高的圖像處理方法,本文將詳細(xì)介紹OpenCV 2.4+ C++ 平滑處理,需要了解更多的朋友可以詳細(xì)參考下

原理

平滑也稱模糊, 是一項簡單且使用頻率很高的圖像處理方法。

平滑處理時需要用到一個濾波器。 最常用的濾波器是線性濾波器,線性濾波處理的輸出像素值(例如:g(i,j))是輸入像素值(例如:f(i+k,j+l))的加權(quán)平均:

    g(i,j) = \sum_{k,l} f(i+k, j+l) h(k,l)

h(k,l)稱為核, 它僅僅是一個加權(quán)系數(shù)。

均值平滑

下面是一個使用blur函數(shù)的均值平滑:

復(fù)制代碼 代碼如下:

#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 );
}

blur函數(shù)API資料:

使用歸一化塊濾波器進(jìn)行模糊圖片操作。

C++: void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT ) 參數(shù)src – 輸入圖片,可以使是任意通道數(shù),該函數(shù)對通道是獨(dú)立處理的,但是深度只能是CV_8U, CV_16U, CV_16S, CV_32F or CV_64F。dst – 輸出圖片,和輸入圖片相同大小和深度。ksize – 模糊內(nèi)核大小。anchor – 錨點(diǎn),默認(rèn)值是(-1,-1),也就是錨點(diǎn)在內(nèi)核的中心。borderType – 用于判斷圖像邊界的模式。

該函數(shù)對圖片進(jìn)行平滑處理利用了下面的內(nèi)核:

\texttt{K} = \frac{1}{\texttt{ksize.width*ksize.height}} \begin{bmatrix} 1 & 1 & 1 & \cdots & 1 & 1 \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \hdotsfor{6} \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \end{bmatrix}

調(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來實現(xiàn)平滑:

復(fù)制代碼 代碼如下:

#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ù) src – 輸入圖片,可以使是任意通道數(shù),該函數(shù)對通道是獨(dú)立處理的,但是深度只能是CV_8UCV_16UCV_16SCV_32F or CV_64F.dst – 輸出圖片,和輸入圖片相同大小和深度。ksize – 高斯內(nèi)核大小。ksize.widthksize.height允許不相同但他們必須是正奇數(shù)?;蛘叩扔?,由參數(shù)sigma的乘機(jī)決定。sigmaX – 高斯內(nèi)核在X方向的標(biāo)準(zhǔn)偏差。sigmaY – 高斯內(nèi)核在Y方向的標(biāo)準(zhǔn)偏差。如果sigmaY為0,他將和sigmaX的值相同,如果他們都為0,那么他們由ksize.widthksize.height計算得出。borderType – 用于判斷圖像邊界的模式。

最有用的濾波器 (盡管不是最快的)。 高斯濾波是將輸入數(shù)組的每一個像素點(diǎn)與高斯內(nèi)核卷積將卷積和當(dāng)作輸出像素值。

http://www.cnblogs.com/http://www.cnblogs.com/_images/Smoothing_Tutorial_theory_gaussian_0.jpg

參考一維高斯函數(shù),我們可以看見,他是個中間大兩邊小的函數(shù)。

所以高斯濾波器其加權(quán)數(shù)是中間大,四周小的。

其二維高斯函數(shù)為:

    G_{0}(x, y) = A e^{ \dfrac{ -(x - \mu_{x})^{2} }{ 2\sigma^{2}_{x} } + \dfrac{ -(y - \mu_{y})^{2} }{ 2\sigma^{2}_{y} } } 

其中 \mu 為均值 (峰值對應(yīng)位置),\sigma 代表標(biāo)準(zhǔn)差 (變量x 和 變量y 各有一個均值,也各有一個標(biāo)準(zhǔn)差)。

中值平滑

使用medianBlur執(zhí)行中值平滑:

復(fù)制代碼 代碼如下:

#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) Parameters:src – 支持1、3、4通道圖片輸入,當(dāng)ksize為3或者5時,圖片的深度只能是CV_8U,,CV_16U,或者 CV_32F,對于其他大孔徑尺寸只支持深度為CV_8U。dst – 輸出圖片,和輸入圖片相同大小和深度。ksize – 線性直徑大小,只能是一個大于1的奇數(shù),例如:3, 5, 7 ...

中值濾波將圖像的每個像素用鄰域 (以當(dāng)前像素為中心的正方形區(qū)域)像素的中值代替 。 

雙邊平滑

使用bilateralFilter執(zhí)行雙邊平滑:

復(fù)制代碼 代碼如下:

#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 ) Parameters:src – 源必須是8位或者浮點(diǎn)數(shù),1或者3通道圖片。dst – 輸出圖片,和輸入圖片相同大小和深度。d – 在濾波過程中使用的各像素鄰域直徑,如果這是一個非整數(shù),則這個值由sigmaSpace決定。sigmaColor – 顏色空間的標(biāo)準(zhǔn)方差。數(shù)值越大,意味著越遠(yuǎn)的的顏色會被混進(jìn)鄰域內(nèi),從而使更大的顏色段獲得相同的顏色。sigmaSpace – 坐標(biāo)空間的標(biāo)注方差。 數(shù)值越大,以為著越遠(yuǎn)的像素會相互影響,從而使更大的區(qū)域足夠相似的顏色獲取相同的顏色。當(dāng)d>0,d指定了鄰域大小且與sigmaSpace無關(guān)。否則,d正比于sigmaSpace。

原理可參考

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)文章

  • set_new_handler(0)有什么用

    set_new_handler(0)有什么用

    本文主要介紹了set_new_handler(0)有什么用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表與雙鏈表的增刪改查操作實現(xiàn)

    C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表與雙鏈表的增刪改查操作實現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了C語言數(shù)據(jù)結(jié)構(gòu)中單鏈表與雙鏈表的增刪改查操作的實現(xiàn),相信大家如果搞懂了本文內(nèi)容,應(yīng)對復(fù)雜的鏈表類的題也就能慢慢鉆研了
    2022-07-07
  • C++實現(xiàn)多源最短路徑之Floyd算法示例

    C++實現(xiàn)多源最短路徑之Floyd算法示例

    這篇文章主要介紹了C++實現(xiàn)多源最短路徑之Floyd算法,結(jié)合實例形式分析了多源最短路徑之Floyd算法的原理、實現(xiàn)方法及核心代碼,需要的朋友可以參考下
    2017-08-08
  • C++類URL編碼和解碼使用技巧

    C++類URL編碼和解碼使用技巧

    在項目開發(fā)過程中,經(jīng)常會使用到c++ 的url編碼和解碼,本文將以此問題詳細(xì)介紹使用技巧,需要的朋友可以參考下
    2012-11-11
  • C++中的unordered_map用法

    C++中的unordered_map用法

    當(dāng)你在C++中需要使用哈希表(無序映射)來管理鍵值對時,unordered_map?是一個非常有用的數(shù)據(jù)結(jié)構(gòu),本文主要介紹了C++中的unordered_map用法,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • OpenCV基于背景減除實現(xiàn)行人計數(shù)

    OpenCV基于背景減除實現(xiàn)行人計數(shù)

    本文主要介紹了如何使用OpenCV C++對視頻中的人流量進(jìn)行統(tǒng)計。文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)OpenCV有一定的幫助,需要的可以了解一下
    2022-01-01
  • dword ptr指令詳細(xì)解析

    dword ptr指令詳細(xì)解析

    8086CPU的指令,可以處理兩種尺寸的數(shù)據(jù),byte和word。所以在機(jī)器指令中要指明,指令進(jìn)行的是字操作還是字節(jié)操作
    2013-09-09
  • 解析C++浮點(diǎn)數(shù)無效值的定義與無效值判定的小結(jié)

    解析C++浮點(diǎn)數(shù)無效值的定義與無效值判定的小結(jié)

    本篇文章是對C++中浮點(diǎn)數(shù)無效值的定義與無效值的判定進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++利用宏實現(xiàn)類成員反射詳解

    C++利用宏實現(xiàn)類成員反射詳解

    這篇文章主要為大家詳細(xì)介紹了C++如何利用宏實現(xiàn)類成員反射,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,有興趣的小伙伴可以了解一下
    2024-01-01
  • C語言實現(xiàn)輸出鏈表中倒數(shù)第k個節(jié)點(diǎn)

    C語言實現(xiàn)輸出鏈表中倒數(shù)第k個節(jié)點(diǎn)

    這篇文章主要介紹了C語言實現(xiàn)輸出鏈表中倒數(shù)第k個節(jié)點(diǎn),主要涉及鏈表的遍歷操作,是數(shù)據(jù)結(jié)構(gòu)中鏈表的常見操作。需要的朋友可以參考下
    2014-09-09

最新評論

寿宁县| 潮州市| 沂水县| 武强县| 安龙县| 乌鲁木齐县| 丰镇市| 彭泽县| 沧源| 什邡市| 濉溪县| 阿拉善右旗| 水城县| 石狮市| 怀安县| 仲巴县| 泉州市| 雷波县| 谢通门县| 咸阳市| 宁安市| 新安县| 伽师县| 梁平县| 革吉县| 凤台县| 溧水县| 香港 | 康保县| 南华县| 沂水县| 潮州市| 大埔县| 京山县| 长寿区| 阳山县| 南华县| 全南县| 成安县| 盘锦市| 霸州市|