opencv在android平臺下的開發(fā)【3】-圖像平滑處理

基本概念
圖像的平滑也就是圖像的模糊處理,簡單但是使用頻率很高路鹰,在執(zhí)行許多高級處理之前都需要先進性圖像的平滑處理惨篱,以提高圖像處理算法效果盏筐。

平滑處理中需要使用濾波器,常用的是線性濾波器砸讳,作用是將輸入像素值的加權(quán)和作為結(jié)果輸出給錨點像素琢融。

g(i,j) 為輸出的錨點像素值;f(i+k,j+l) 為輸入的像素值簿寂;h(k,l) 為核

image

濾波過程示例:

image

圖像讀入到mat

介紹平滑算法之前漾抬,先調(diào)用android自帶圖庫,選擇一張圖片后返回到app中常遂,保存在一個mat對象里纳令。

        //點擊按鈕,啟動圖庫
        btnLoadImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent imgPickerIntent = new Intent(Intent.ACTION_PICK);
                imgPickerIntent.setType("image/*");
                startActivityForResult(imgPickerIntent, REQ_CODE_PICK_IMG);
            }
        });
        
        
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQ_CODE_PICK_IMG) {
            if (resultCode == RESULT_OK) {
                try {
                    //獲取圖庫選擇的圖像
                    final Uri imgUri = data.getData();
                    final InputStream inputStream = getContentResolver().openInputStream(imgUri);
                    //圖像輸入流解析為bitmap對象
                    final Bitmap originImg = BitmapFactory.decodeStream(inputStream);
                    //根據(jù)bitmap信息初始化mat對象
                    src = new Mat(originImg.getHeight(), originImg.getWidth(), CvType.CV_8UC4);
                    //將bitmap轉(zhuǎn)換為mat對象
                    Utils.bitmapToMat(originImg, src);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    }

另外,圖像保存在mat對象中平绩,所以還需要一個顯示mat對象圖像的方法圈匆。

    private void showMat() {
        //根據(jù)mat對象信息初始化bitmap
        Bitmap processedImg = Bitmap.createBitmap(src.cols(), src.rows(), Bitmap.Config.ARGB_8888);
        //將mat對象轉(zhuǎn)換到bitmap
        Utils.matToBitmap(src, processedImg);
        //顯示
        imgProcess.setImageBitmap(processedImg);
    }

均值模糊

使用歸一化塊濾波器,也是最簡單的濾波器捏雌,輸出像素值是核窗口內(nèi)像素的均值跃赚,即所有像素加權(quán)系數(shù)相等。

核如下:

image

opencv-android sdk 提供的方法如下

    /**
     * 均值模糊
     * @param src 源圖像mat
     * @param dst 目標(biāo)圖像mat
     * @param ksize 核大小
     */
    public static void blur(Mat src, Mat dst, Size ksize)
    {
        //sdk封裝的一個jni方法性湿,具體的實現(xiàn)在.so庫中用c/c++實現(xiàn)
        blur_2(src.nativeObj, dst.nativeObj, ksize.width, ksize.height);
        
        return;
    }

方法使用如下:

Imgproc.blur(src, src, new Size(3, 3));
showMat();

高斯模糊

高斯濾波器是最有用的濾波器(不是最快)纬傲,將輸入的每一個像素點與高斯內(nèi)核的卷積核作為輸出像素值。

高斯模糊中肤频,距離錨點像素越近的輸入像素權(quán)重越高叹括,即臨近錨點像素對像素結(jié)果的影響比那些較遠的像素要高。

image

高斯核是通過高斯函數(shù)獲得的

image

opencv-android sdk 提供的方法如下

    //javadoc: GaussianBlur(src, dst, ksize, sigmaX)
    public static void GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)
    {
        //sdk封裝的一個jni方法着裹,具體的實現(xiàn)在.so庫中用c/c++實現(xiàn)
        GaussianBlur_2(src.nativeObj, dst.nativeObj, ksize.width, ksize.height, sigmaX);
        
        return;
    }

方法使用

Imgproc.GaussianBlur(src, src, new Size(3, 3), 0);
showMat();

中值濾波

中值濾波是將圖像的每個像素用鄰域像素的中值代替领猾。

opencv-android sdk 提供的方法如下

    //javadoc: medianBlur(src, dst, ksize)
    public static void medianBlur(Mat src, Mat dst, int ksize)
    {
        
        medianBlur_0(src.nativeObj, dst.nativeObj, ksize);
        
        return;
    }

方法使用

Imgproc.medianBlur(src, src, 3);
showMat();

總結(jié)

這里簡單介紹了幾種濾波器和opencv對應(yīng)的方法,并在android下進行了簡單使用骇扇,具體的代碼可以參見demo

另外摔竿,也知道了,opencv-android sdk 的方法其實都是jni封裝的c/c++的實現(xiàn)少孝,sdk中也沒有什么注釋继低,但是方法的參數(shù)和作用是和c/c++保持一致的,所以閱讀opencv官網(wǎng)上的開發(fā)文檔即可(部分章節(jié)有java的示例和說明)稍走。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袁翁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子婿脸,更是在濱河造成了極大的恐慌粱胜,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狐树,死亡現(xiàn)場離奇詭異焙压,居然都是意外死亡,警方通過查閱死者的電腦和手機抑钟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門涯曲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人在塔,你說我怎么就攤上這事幻件。” “怎么了蛔溃?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵绰沥,是天一觀的道長篱蝇。 經(jīng)常有香客問我,道長揪利,這世上最難降的妖魔是什么态兴? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任狠持,我火速辦了婚禮疟位,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喘垂。我一直安慰自己甜刻,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布正勒。 她就那樣靜靜地躺著得院,像睡著了一般。 火紅的嫁衣襯著肌膚如雪章贞。 梳的紋絲不亂的頭發(fā)上祥绞,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音鸭限,去河邊找鬼蜕径。 笑死,一個胖子當(dāng)著我的面吹牛败京,可吹牛的內(nèi)容都是我干的兜喻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赡麦,長吁一口氣:“原來是場噩夢啊……” “哼朴皆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泛粹,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤遂铡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后晶姊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扒接,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年帽借,在試婚紗的時候發(fā)現(xiàn)自己被綠了珠增。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡砍艾,死狀恐怖蒂教,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脆荷,我是刑警寧澤凝垛,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布懊悯,位于F島的核電站,受9級特大地震影響梦皮,放射性物質(zhì)發(fā)生泄漏炭分。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一剑肯、第九天 我趴在偏房一處隱蔽的房頂上張望捧毛。 院中可真熱鬧,春花似錦让网、人聲如沸呀忧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽而账。三九已至,卻和暖如春因篇,著一層夾襖步出監(jiān)牢的瞬間泞辐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工竞滓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咐吼,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓虽界,卻偏偏與公主長得像柴罐,于是被迫代替她去往敵國和親娜氏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

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