Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> OpenCV實現圖片銳化

OpenCV實現圖片銳化

編輯:關於Android編程

效果圖

效果圖

效果圖

源碼

KqwOpenCVBlurDemo

銳化也可以看作是一種線性濾波操作,並且錨點像素有較高的權重,而周圍的像素權重較低。
因此,我們可以自定義一個這樣的

自定義核

/*
    自定義核
    0   -1  0
    -1  5   -1
    0   -1  0
  */
Mat kernel = new Mat(3, 3, CvType.CV_16SC1);
kernel.put(0, 0, 0, -1, 0, -1, 5, -1, 0, -1, 0);

這裡我們將圖像的深度設為16SC1,表示包含一個通道(C1),圖像中的每個像素包含一個16比特有符號整型數(16S)。

定義完以後,我們對圖像和做卷積操作

// 對圖像和自定義核做卷積
Imgproc.filter2D(src, src, src.depth(), kernel);
第一個參數表示輸入的圖像 第二個參數表示輸出的圖像 第三個參數表示圖像的深度 第四個參數是我們自定義的核

封裝

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

/**
 * 銳化圖片
 *
 * @param bitmap 要處理的圖片
 */
public void filter2D(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);

                        /*
                            自定義核
                            0   -1  0
                            -1  5   -1
                            0   -1  0
                          */
                        Mat kernel = new Mat(3, 3, CvType.CV_16SC1);
                        kernel.put(0, 0, 0, -1, 0, -1, 5, -1, 0, -1, 0);
                        // 對圖像和自定義核做卷積
                        Imgproc.filter2D(src, src, src.depth(), kernel);

                        // 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.filter2D(mSelectImage);
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved