2014年4月11日 星期五

(四)OpenCV圖像模糊與銳化

    操作影片:

    影片連結

    一、實際操作

    1.延續前面讀圖的程式,首先拉一個TextView到畫面的中間,並改名為”Result”,可在畫面右側屬性(Properties)Text的地方修改或是透過xml描述檔修改名稱

    image001 image003  image005

    2.再拉一個ImageView到畫面下方,出現對話視窗點OK

      image009 image007

    連點兩下新增的ImageView進入xml描述檔,將ImageView2的程式碼改寫為:

    <ImageView

    android:id="@+id/imageView2"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_below="@+id/textView2"

    android:layout_centerHorizontal="true"

    android:maxHeight="100dp"

    android:maxWidth="100dp" />

    image011

    3.另外在ImageView1最後面加上一行程式碼:

    android:src="@drawable/cat "

      image013

    4.進入到MainActivity.java,前面已經加入讀圖的程式碼,現在要改寫成具有模糊效果的程式,將新的程式碼鍵入圖片中紅色箭頭處,即兩段程式碼的中間

      image015

    Code:

            Mat footMat = new Mat();

            Mat dstM = new Mat();

            Utils. bitmapToMat(footbm, footMat);

    Imgproc. GaussianBlur(footMat, dstM, new Size(21,21), 11, 11);

    Bitmap bm = Bitmap. createBitmap(footMat.cols(), footMat.rows(),Bitmap.Config.ARGB_8888 );

            Utils. matToBitmap(dstM, bm);

      image017

    5.新增完程式碼後,將最後一段程式碼中的ImageView1改成ImageView2,括弧中的footbm改為bm

      image019

    6.一切準備就緒後,就可以開始run程式囉! (在啟動AVD模擬器之前請先ctrl+s儲存專案)

    圖像模糊程式執行結果如圖:

    image021

    7.圖像模糊執行成功後,讓我們來試試看銳化的功能吧!先打開MainActivity.java,在圖片中紅色箭頭處加上一行程式碼:

    Core.addWeighted(footMat, 1.5, dstM, -0.5, 0, dstM);

     image023

    8.再重新run一次程式看看,現在圖像已經從原本的模糊改成銳化效果囉!

    (在啟動AVD模擬器之前請先ctrl+s儲存專案)

    image025

    二、課程講解

     

    1.xml描述檔說明

    android:layout_width="wrap_content"

  • wrap_content的意思是根據組件的內容自動調整組件大小

    android:layout_below="@+id/textView1"

  • 此段敘述表示該物件會在"textView1"的相對位置下方

    android:layout_centerHorizontal="true"

  • 此段敘述的效果為水平置中

    android:maxHeight="100dp"

  • 設定最大高度

    android:maxWidth="100dp"

  • 設定最大寬度

    android:src="@drawable/cat "

  • 讀取圖片"cat"

 

    2.MainActivity.java程式碼註解

    // 宣告opencv mat

            Mat footMat = new Mat();

            Mat dstM = new Mat();

    // 將 bmp轉為 mat格式

            Utils. bitmapToMat(footbm, footMat);

    // 對mat做高斯模糊

            Imgproc. GaussianBlur(footMat, dstM, new Size(21,21), 11, 11);

    // 宣告另一個bmp 將處理好的mat轉到新的bmp

            Bitmap bm = Bitmap. createBitmap(footMat.cols(), footMat.rows(),Bitmap.Config.ARGB_8888 );

            Utils. matToBitmap(dstM, bm);

    其中「對mat做高斯模糊」的部分,只要更改Size(21,21)中的數字ex:(41,41),就可以調整圖像改變效果的程度(銳化也是一樣),要注意的是數字必須為奇數,數值越大效果越明顯

    其中的原理請參考OpenCV官方文件高斯模糊Filter

沒有留言:

張貼留言