非线性滤波(opencv)
中值濾波
對于3*3窗口,利用窗口內(nèi)像素灰度值的中值代替中心點像素值,也就是先對窗口內(nèi)的9個像素排序,然后取第五個像素代替中心點像素值。該方法在去除椒鹽噪聲、脈沖噪聲方面效果很好,因為該方法可以直接過濾較高或較低的像素值。
椒鹽噪聲也稱為脈沖噪聲,是圖像中經(jīng)常見到的一種噪聲,它是一種隨機出現(xiàn)的白點或者黑點,可能是亮的區(qū)域有黑色像素或是在暗的區(qū)域有白色像素。
函數(shù)原型:
void medianBlur(InputArray src, OutputArray dst, int kszie);
參數(shù)詳解;
第一個參數(shù):InputArray類型的src,輸入圖像,Mat類的對象。該函數(shù)對通道是獨立處理的,且可以處理1、3或4得到的Mat圖像,但是待處理的圖像深度應(yīng)該是CV_8U,CV_16U,CV_32F,但是對于較大孔徑尺寸的圖像,只能是CV_8U。
第二個參數(shù):OutputArray類型的dst,目標圖像,需要和輸入圖像有相同的尺寸和類型。
第三個參數(shù):int類型ksize,孔徑的線型尺寸,必須是大于1的奇數(shù)。
雙邊濾波
雙邊濾波(Bilateral filter)是一種非線性的濾波方法,雙邊濾波器的好處是可以做邊緣保存(edge preserving),在圖像的平坦區(qū)域,像素值變化很小,對應(yīng)的像素范圍域權(quán)重接近于1,此時空間域權(quán)重起主要作用,相當于進行高斯模糊;在圖像的邊緣區(qū)域,像素值變化很大,像素范圍域權(quán)重變大,從而保持了邊緣的信息。?
函數(shù)原型:
void bilateralFilter(InputArray src, OutputArray dst, int d,double sigmaColor,double sigmaSpace,int borderType=BORDER_DEFAULT);
參數(shù)詳解;
第一個參數(shù):InputArray類型的src,輸入圖像,Mat類的對象。該函數(shù)對通道是獨立處理的,且可以處理1、3或4得到的Mat圖像,但是待處理的圖像深度應(yīng)該是CV_8U,CV_16U,CV_32F,但是對于較大孔徑尺寸的圖像,只能是CV_8U。
第二個參數(shù):OutputArray類型的dst,目標圖像,需要和輸入圖像有相同的尺寸和類型。
第三個參數(shù):int類型d,過濾像素鄰域的直徑。
第四個參數(shù):double類型的sigmaColor,顏色空間濾波器的值。參數(shù)越大,表明像素鄰域內(nèi)有越寬的顏色混合到一起。
第五個參數(shù):double類型的sigmaSpace,坐標空間濾波器的值。參數(shù)越大,表明越遠的像素有相互影響。
程序
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<vector>
#include<time.h>
#include<opencv2/core/core.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//--------------------------------------【main( )函數(shù)】-----------------------------------------
// 描述:控制臺應(yīng)用程序的入口函數(shù),我們的程序從這里開始執(zhí)行
//-------------------------------------------------------------------------------------------------Mat src = imread("D:\\VC\\c++\\opencv源碼\\opencv源碼\\12.bmp");
Mat dst1 ,dst2;
int mediafilter = 3;//中值濾波參數(shù)值
int shuangfilter = 4;//雙邊濾波參數(shù)值//中值濾波回調(diào)函數(shù)
void on_media(int, void*)
{medianBlur(src, dst1, 2 * mediafilter+1);imshow("中值濾波", dst1);
}//雙邊濾波回調(diào)函數(shù)
void on_shuang(int, void*)
{bilateralFilter(src, dst2, shuangfilter, (double)shuangfilter*2+1, shuangfilter/2);imshow("雙邊濾波", dst2);
}
int main()
{double time0 = static_cast<double>(getTickCount());//記錄起始時間namedWindow("原圖", WINDOW_FREERATIO);namedWindow("中值濾波", WINDOW_FREERATIO);namedWindow("雙邊濾波", WINDOW_FREERATIO);imshow("原圖", src);//中值濾波createTrackbar("內(nèi)核值", "中值濾波", &mediafilter, 20, on_media);on_media(mediafilter, 0);//雙邊濾波createTrackbar("內(nèi)核值", "雙邊濾波", &shuangfilter, 20, on_shuang);on_shuang(shuangfilter, 0);time0 = ((double)getTickCount() - time0) / getTickFrequency();cout << "此方法運行時間:" << time0 << "秒" << endl;//輸出運行時間waitKey(0);return 0;
}
?
總結(jié)
以上是生活随笔為你收集整理的非线性滤波(opencv)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv线性滤波(滤波与模糊的区别)
- 下一篇: 腐蚀与膨胀