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

基本概念 圖像的平滑也就是圖像的模糊處理,簡單可是使用頻率很高,在執行許多高級處理以前都須要先進性圖像的平滑處理,以提升圖像處理算法效果。java

平滑處理中須要使用濾波器,經常使用的是線性濾波器,做用是將輸入像素值的加權和做爲結果輸出給錨點像素。android

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

image

濾波過程示例:git

image

圖像讀入到matgithub

介紹平滑算法以前,先調用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);
                    //根據bitmap信息初始化mat對象
                    src = new Mat(originImg.getHeight(), originImg.getWidth(), CvType.CV_8UC4);
                    //將bitmap轉換爲mat對象
                    Utils.bitmapToMat(originImg, src);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    }
複製代碼

另外,圖像保存在mat對象中,因此還須要一個顯示mat對象圖像的方法。app

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

均值模糊ide

使用歸一化塊濾波器,也是最簡單的濾波器,輸出像素值是核窗口內像素的均值,即全部像素加權係數相等。函數

核以下:spa

image

opencv-android sdk 提供的方法以下

/** * 均值模糊 * @param src 源圖像mat * @param dst 目標圖像mat * @param ksize 核大小 */
    public static void blur(Mat src, Mat dst, Size ksize) {
        //sdk封裝的一個jni方法,具體的實如今.so庫中用c/c++實現
        blur_2(src.nativeObj, dst.nativeObj, ksize.width, ksize.height);
        
        return;
    }
複製代碼

方法使用以下:

Imgproc.blur(src, src, new Size(3, 3));
showMat();
複製代碼

高斯模糊

高斯濾波器是最有用的濾波器(不是最快),將輸入的每個像素點與高斯內核的卷積核做爲輸出像素值。

高斯模糊中,距離錨點像素越近的輸入像素權重越高,即臨近錨點像素對像素結果的影響比那些較遠的像素要高。

image

高斯核是經過高斯函數得到的

image

opencv-android sdk 提供的方法以下

//javadoc: GaussianBlur(src, dst, ksize, sigmaX)
    public static void GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) {
        //sdk封裝的一個jni方法,具體的實如今.so庫中用c/c++實現
        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();
複製代碼

總結

這裏簡單介紹了幾種濾波器和opencv對應的方法,並在android下進行了簡單使用,具體的代碼能夠參見demo

另外,也知道了,opencv-android sdk 的方法其實都是jni封裝的c/c++的實現,sdk中也沒有什麼註釋,可是方法的參數和做用是和c/c++保持一致的,因此閱讀opencv官網上的開發文檔便可(部分章節有java的示例和說明)。

相關文章
相關標籤/搜索