android使用OpenCV之圖像濾波處理

圖像濾波:
盡量保留圖像細(xì)節(jié)特征的條件下對目標(biāo)圖像的噪聲進(jìn)行抑制和平滑處理,是圖像預(yù)處理中不可缺少的操作,其處理效果的好壞將直接影響到后續(xù)圖像處理和分析的有效性和可靠性。
濾波器
低通濾波器(允許低頻通過)占遥,高通濾波器理盆,帶通濾波器痘煤,帶阻濾波器,全通濾波器猿规,陷波濾波器衷快。
我在這兒主要介紹OpenCV中所提供的濾波操作,線性濾波與非線性濾波姨俩。
opencv中線性濾波操作有:方框濾波蘸拔、均值濾波和高斯濾波师郑。非線性濾波操作有:中值濾波和雙邊濾波。

方框濾波

講到方框濾波调窍,我們不能不提及的是線性鄰域濾波算子宝冕,即用不同的權(quán)重去結(jié)合一個小鄰域內(nèi)的像素,來得到應(yīng)有的處理效果邓萨。鄰域濾波(卷積):左邊圖像與中間圖像的卷積產(chǎn)生右邊圖像地梨。目標(biāo)圖像中綠色標(biāo)記的像素是利用原圖像中藍(lán)色標(biāo)記的像素計算得到的。線性濾波處理的輸出像素值g(i,j)是輸入像素值f(j+k,j+l)的加權(quán)和 先誉,其中加權(quán)和稱之為“核”湿刽,濾波器的加權(quán)系數(shù),即濾波器的“濾波系數(shù)”褐耳。

這里寫圖片描述
這里寫圖片描述
  /**
      * opencv中方框濾波函數(shù)
      * 第一個參數(shù):輸入的圖片
      * 第二個參數(shù):輸出的圖片
      * 第三個參數(shù):圖片的深度(存儲每個像素所用的位數(shù))一般情況使用-1也就是原有的圖像深度
      * 第四個參數(shù):核心的大小
      * 第五個參數(shù):錨點的位置诈闺,就是我們要進(jìn)行處理的點,默認(rèn)值(-1铃芦,-1)表示錨點在核的中心
      * 第六個參數(shù):normalize默認(rèn)值為true雅镊,表示內(nèi)核是否被其區(qū)域歸一化(normalized)了,當(dāng)normalize=true的時候刃滓,方框濾波就變成了我們熟悉的均值濾波仁烹。也就是說,均值濾波是方框濾波歸一化(normalized)后的特殊情況咧虎。其中卓缰,歸一化就是把要處理的量都縮放到一個范圍內(nèi),比如(0,1),以便統(tǒng)一處理和直觀量化砰诵。而非歸一化(Unnormalized)的方框濾波用于計算每個像素鄰域內(nèi)的積分特性征唬,比如密集光流算法(dense optical flow algorithms)中用到的圖像倒數(shù)的協(xié)方差矩陣(covariance matrices of image derivatives)如果我們要在可變的窗口中計算像素總和,可以使用integral()函數(shù)
      * 第七個參數(shù):邊界模式茁彭,默認(rèn)值BORDER_DEFAULT
      */
CV_EXPORTS_W void boxFilter( InputArray src, OutputArray dst, int ddepth,
                             Size ksize, Point anchor = Point(-1,-1),
                             bool normalize = true,
                             int borderType = BORDER_DEFAULT );

extern "C"
JNIEXPORT jintArray JNICALL
Java_com_xy_opencv_ndk_1opencv002_MainActivity_blurImage(JNIEnv *env, jclass type,jintArray pixels_, jint w, jint h) {
    jint *pixels = env->GetIntArrayElements(pixels_, NULL);
    Mat img(h, w, CV_8UC4, pixels);
    boxFilter(img,img,-1,Size(30,30));
    int size = w * h;
    jintArray array = env->NewIntArray(size);
    env->SetIntArrayRegion(array, 0, size, pixels);
    env->ReleaseIntArrayElements(pixels_, pixels, 0);
    return array;
    }
這里寫圖片描述

均值濾波
方框濾波歸一化之后就是均值濾波总寒。也就是輸出圖像的每一個像素是核窗口內(nèi)輸入圖像對應(yīng)像素的像素平均值( 所有像素加權(quán)系數(shù)相等)。

 /**
 * 均值濾波(歸一化之后又進(jìn)行了方框濾波)
 * 第一個參數(shù):輸入的圖片
 * 第二個參數(shù):輸出的圖片
 * 第三個參數(shù):核心的大小
 * 第四個參數(shù):錨點的位置理肺,就是我們要進(jìn)行處理的點摄闸,默認(rèn)值(-1,-1)表示錨點在核的中心
 * 第五個參數(shù):邊界模式妹萨,默認(rèn)值BORDER_DEFAULT
 */

CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor = Point(-1,-1),
                        int borderType = BORDER_DEFAULT );
extern "C"
JNIEXPORT jintArray JNICALL
Java_com_xy_opencv_ndk_1opencv002_MainActivity_blurImage(JNIEnv *env, jclass type,jintArray pixels_, jint w, jint h) {
    jint *pixels = env->GetIntArrayElements(pixels_, NULL);
    Mat img(h, w, CV_8UC4, pixels);
    blur(img,img,Size(30,30));
    int size = w * h;
    jintArray array = env->NewIntArray(size);
    env->SetIntArrayRegion(array, 0, size, pixels);
    env->ReleaseIntArrayElements(pixels_, pixels, 0);
    return array;
    }
引用塊內(nèi)容

高斯濾波

高斯濾波是一種線性平滑濾波年枕,適用于消除高斯噪聲,廣泛應(yīng)用于圖像處理的減噪過程乎完。通俗的講熏兄,高斯濾波就是對整幅圖像進(jìn)行加權(quán)平均的過程,每一個像素點的值,都由其本身和鄰域內(nèi)的其他像素值經(jīng)過加權(quán)平均后得到霍弹。高斯濾波的具體操作是:用一個模板(或稱卷積、掩模)掃描圖像中的每一個像素娃弓,用模板確定的鄰域內(nèi)像素的加權(quán)平均灰度值去替代模板中心像素點的值典格。從數(shù)學(xué)的角度來看,圖像的高斯模糊過程就是圖像與正態(tài)分布做卷積台丛。由于正態(tài)分布又叫作高斯分布耍缴,所以這項技術(shù)就叫作高斯模糊。圖像與圓形方框模糊做卷積將會生成更加精確的焦外成像效果挽霉。由于高斯函數(shù)的傅立葉變換是另外一個高斯函數(shù)防嗡,所以高斯模糊對于圖像來說就是一個低通濾波操作。高斯濾波器是一類根據(jù)高斯函數(shù)的形狀來選擇權(quán)值的線性平滑濾波器侠坎。高斯平滑濾波器對于抑制服從正態(tài)分布的噪聲非常有效蚁趁。一維零均值高斯函數(shù)為:G(x)=exp(-x2/2sigma2)。其中实胸,高斯分布參數(shù)Sigma決定了高斯函數(shù)的寬度他嫡。對于圖像處理來說,常用二維零均值離散高斯函數(shù)作平滑濾波器庐完。

這里寫圖片描述

   /**
     * 高斯濾波
     * 第一個參數(shù):傳入的圖片
     * 第二個參數(shù):傳出的圖片
     * 第三個參數(shù):核心(必須是正數(shù)和奇數(shù))
     * 第四個參數(shù):sigmaX代表高斯函數(shù)在x方向的標(biāo)準(zhǔn)偏差
     * 第五個參數(shù):sigmaY代表高斯函數(shù)在Y方向的標(biāo)準(zhǔn)偏差钢属,有默認(rèn)值為0
     * 第六個參數(shù):邊界模式,使用默認(rèn)值BORDER_DEFAULT
     */
CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY = 0, int borderType = BORDER_DEFAULT );
extern "C"
JNIEXPORT jintArray JNICALL
Java_com_xy_opencv_ndk_1opencv002_MainActivity_blurImage(JNIEnv *env, jclass type,jintArray pixels_, jint w, jint h) {
    jint *pixels = env->GetIntArrayElements(pixels_, NULL);
    Mat img(h, w, CV_8UC4, pixels);
    GaussianBlur(img,img,Size(31,31),0);
    int size = w * h;
    jintArray array = env->NewIntArray(size);
    env->SetIntArrayRegion(array, 0, size, pixels);
    env->ReleaseIntArrayElements(pixels_, pixels, 0);
    return array;
    }

中值濾波

中值濾波很簡單门躯,一種非線性濾波操作淆党,就是孔徑范圍內(nèi)的所有像素進(jìn)行排序,然后取中位數(shù)讶凉,賦值給核心染乌。

  /**
     * 中值濾波,孔徑范圍內(nèi)的所有像素進(jìn)行排序,然后取中位數(shù)缀遍,賦值給核心慕匠。
     * 第一個參數(shù):傳入的圖片
     * 第二個參數(shù):傳出的圖片
     * 第三個參數(shù):孔徑的線性尺寸,必須是大于1的奇數(shù)
     */
CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );
extern "C"
JNIEXPORT jintArray JNICALL
Java_com_xy_opencv_ndk_1opencv002_MainActivity_blurImage(JNIEnv *env, jclass type,jintArray pixels_, jint w, jint h) {
    jint *pixels = env->GetIntArrayElements(pixels_, NULL);
    Mat img(h, w, CV_8UC4, pixels);
    medianBlur(img,img,31);
    int size = w * h;
    jintArray array = env->NewIntArray(size);
    env->SetIntArrayRegion(array, 0, size, pixels);
    env->ReleaseIntArrayElements(pixels_, pixels, 0);
    return array;
    }

雙邊濾波

雙邊濾波(Bilateral filter)是一種非線性的濾波方法域醇,是結(jié)合圖像的空間鄰近度和像素值相似度的一種折中處理台谊,同時考慮空域信息和灰度相似性,達(dá)到保邊去噪的目的譬挚。具有簡單锅铅、非迭代、局部的特點 减宣。雙邊濾波器的好處是可以做邊緣保存(edge preserving)盐须,一般過去用的維納濾波或者高斯濾波去降噪,都會較明顯地模糊邊緣漆腌,對于高頻細(xì)節(jié)的保護(hù)效果并不明顯贼邓。雙邊濾波器顧名思義比高斯濾波多了一個高斯方差sigma-d阶冈,它是基于空間分布的高斯濾波函數(shù),所以在邊緣附近塑径,離的較遠(yuǎn)的像素不會太多影響到邊緣上的像素值女坑,這樣就保證了邊緣附近像素值的保存。但是由于保存了過多的高頻信息统舀,對于彩色圖像里的高頻噪聲匆骗,雙邊濾波器不能夠干凈的濾掉,只能夠?qū)τ诘皖l信息進(jìn)行較好的濾波誉简。

 /**
   * 雙邊濾波
   * 第一個參數(shù):傳入的圖片(必須是CV_8UC1或者CV_8UC3)
   * 第二個參數(shù):傳出的圖片
   * 第三個參數(shù):每個像素領(lǐng)域的直徑
   * 第四個參數(shù):sigmaColor碉就,這個值越大,該像素領(lǐng)域內(nèi)會有更廣的顏色被混合到一起
   * 第五個參數(shù):sigmaSpace闷串,這個值越大瓮钥,越遠(yuǎn)的像素會互相影響,第三個參數(shù)大于0時烹吵,領(lǐng)域的大小和這個值無關(guān)骏庸,否則成正比
   * 第六個參數(shù):使用默認(rèn)值BORDER_DEFAULT
   */
CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace, int borderType = BORDER_DEFAULT );
extern "C"
JNIEXPORT jintArray JNICALL
Java_com_xy_opencv_ndk_1opencv002_MainActivity_blurImage(JNIEnv *env, jclass type,jintArray pixels_, jint w, jint h) {
    jint *pixels = env->GetIntArrayElements(pixels_, NULL);
    Mat img(h, w, CV_8UC3, pixels);
    Mat out(h,w,CV_8UC4);
    bilateralFilter(img,out,25,25*2,25/2);
    int size = w * h;
    jint *re = (jint *) out.data;
    jintArray array = env->NewIntArray(size);
    env->SetIntArrayRegion(array, 0, size, re);
    env->ReleaseIntArrayElements(pixels_, pixels, 0);
    return array;
    }

這里寫圖片描述

本文章著作版權(quán)所屬:微笑面對,請關(guān)注我的CSDN博客:博客地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市年叮,隨后出現(xiàn)的幾起案子具被,更是在濱河造成了極大的恐慌,老刑警劉巖只损,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件一姿,死亡現(xiàn)場離奇詭異,居然都是意外死亡跃惫,警方通過查閱死者的電腦和手機(jī)叮叹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爆存,“玉大人蛉顽,你說我怎么就攤上這事∠冉希” “怎么了携冤?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長闲勺。 經(jīng)常有香客問我曾棕,道長,這世上最難降的妖魔是什么菜循? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任翘地,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衙耕。我一直安慰自己昧穿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布橙喘。 她就那樣靜靜地躺著粤咪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪渴杆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天宪塔,我揣著相機(jī)與錄音磁奖,去河邊找鬼。 笑死某筐,一個胖子當(dāng)著我的面吹牛比搭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播南誊,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼身诺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抄囚?” 一聲冷哼從身側(cè)響起霉赡,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幔托,沒想到半個月后穴亏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡重挑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年嗓化,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谬哀。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡刺覆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出史煎,到底是詐尸還是另有隱情谦屑,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布篇梭,位于F島的核電站伦仍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏很洋。R本人自食惡果不足惜充蓝,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谓苟,春花似錦官脓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仑撞,卻和暖如春赤兴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隧哮。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工桶良, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沮翔。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓陨帆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親采蚀。 傳聞我的和親對象是個殘疾皇子疲牵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容