Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> OpenCV實現圖像亮區擴張

OpenCV實現圖像亮區擴張

編輯:關於Android編程

效果圖

效果圖

效果圖

源碼

KqwOpenCVBlurDemo

亮區擴張,也叫膨脹,要實現這樣的效果,我們可以選取一個合適大小的,用被核覆蓋的最大值代替錨點像素。膨脹可以用來融合可能被分割的目標。

二值圖像(左)和膨脹後的圖像(右)

我們首先定義一個合適大小的核

Mat kernelDilate = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));

然後調用Imgproc.dilate()方法把圖像的亮區放大

// 擴大亮區
Imgproc.dilate(src, src, kernelDilate);

封裝

這裡我用到了RxJava。主要是因為圖片處理是耗時操作,會阻塞線程,為了防止界面卡頓,這裡使用RxJava進行了線程切換。

/**
 * 擴大圖片亮區
 *
 * @param bitmap 要處理的圖片
 */
public void dilate(Bitmap bitmap) {
    // 使用RxJava處理圖片
    if (null != mSubscriber)
        Observable
                .just(bitmap)
                .map(new Func1() {

                    @Override
                    public Bitmap call(Bitmap bitmap) {
                        // Bitmap轉為Mat
                        Mat src = new Mat(bitmap.getHeight(), bitmap.getWidth(), CvType.CV_8UC4);
                        Utils.bitmapToMat(bitmap, src);

                        // 定義一個合適大小的核
                        Mat kernelDilate = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));
                        // 擴大亮區
                        Imgproc.dilate(src, src, kernelDilate);

                        // Mat轉Bitmap
                        Bitmap processedImage = Bitmap.createBitmap(src.cols(), src.rows(), Bitmap.Config.ARGB_8888);
                        Utils.matToBitmap(src, processedImage);

                        return processedImage;
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(mSubscriber);
}

調用

// 圖片處理的工具類
mBlurUtil = new BlurUtil(new Subscriber() {
    @Override
    public void onCompleted() {
        // 圖片處理完成
        dismissProgressDialog();
    }

    @Override
    public void onError(Throwable e) {
        // 圖片處理異常
        dismissProgressDialog();
    }

    @Override
    public void onNext(Bitmap bitmap) {
        // 獲取到處理後的圖片
        mIvImageProcessed.setImageBitmap(bitmap);
    }
});

// 擴大圖片亮區
mBlurUtil.dilate(mSelectImage);
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved