OpenCV3 Threshold、adaptiveThreshold JAVA OpenCV專題學習11

關於 JAVA 學習 OpenCV 的內容,函數講解。內容我均整理在 GitHubd的【OpenCV3-Study-JAVAhtml

下面代碼中所需的項目結構,圖片,請訪問 GitHub 獲取。java

JAVA 代碼部分

package opencv.study;

import com.liuqi.opencv.base.OpenCVProcessBase;
import org.junit.Test;
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

/**
 * @Author : alexliu
 * @Description : 主要學習<br/>
 * 1. threshold 固定閾值操做<br/>
 * 2. adaptiveThreshold 自適應閾值操做<br/>
 */
public class StudySection_11 extends OpenCVProcessBase {


    private String save_dir = "study-output/study-opencv-11";

    /**--------------------*
     *  第一節 threshold
     **--------------------*/

    /**
     * 固定閾值操做
     *
     * 獲得二值化圖像。
     */
    @Test
    public void testThreshold(){

        /*
         * 原文地址 : https://docs.opencv.org/3.0-beta/modules/imgproc/doc/miscellaneous_transformations.html?highlight=threshold#double%20threshold(InputArray%20src,%20OutputArray%20dst,%20double%20thresh,%20double%20maxval,%20int%20type)
         *
         * 原型方法 :
         *      threshold(Mat src, Mat dst, double thresh, double maxval, int type)
         *
         *      參數 :
         *          src : Mat 輸入圖像 單通道 8 或 32浮點圖像
         *          dst : Mat 輸出圖像 閾值操做結果填充在此圖像
         *          thresh : double 閾值
         *          maxval : double 當 type 爲 THRESH_BINARY 或 THRESH_BINARY_INV 時的最大值
         *          type : int , 閾值類型。對對象取閾值的方式
         *              -- 【0】THRESH_BINARY : src(x,y) > thresh ? maxval : 0 。 當前像素點的灰度值 > thresh ,當前像素點值爲 maxval ,反之爲0
         *              -- 【1】THRESH_BINARY_INV : src(x,y) > thresh ? 0 : maxval 。 當前像素點灰度值 > thresh , 當前像素點值爲 0 反之爲 maxval
         *              -- 【2】THRESH_TRUNC : src(x,y) > thresh ? threshold : src(x,y)。當前像素點灰度值 > thresh , 設定爲thresh ,反之保持不變
         *              -- 【3】THRESH_TOZERO : src(x,y) > thresh ? src(x,y) : 0 。 當前像素點灰度值 > thresh , 當前像素點值保持不變,其餘狀況爲0
         *              -- 【4】THRESH_TOZERO_INV : src(x,y) > thresh ? 0 : src(x,y) 。 當前像素點灰度值 > thresh , 當前像素點值爲0 ,其餘狀況保持不變
         */

        Mat src = Imgcodecs.imread(this.p_test_file_path + "/caoyuan.jpg",Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
        this.saveImage(this.save_dir + "/image_thresh_0.png",src);

        Mat dst = new Mat();
        // 像素灰度值 > 125(灰色)爲 255(白色),其餘爲 0(黑色)
        Imgproc.threshold(src,dst,125,255,Imgproc.THRESH_BINARY);
        this.saveImage(this.save_dir + "/image_thresh_1.png",dst);

        // 像素灰度值 > 125(灰色)爲 0(黑色),其餘爲 255(白色)
        Imgproc.threshold(src,dst,125,255,Imgproc.THRESH_BINARY_INV);
        this.saveImage(this.save_dir + "/image_thresh_2.png",dst);

        // 像素灰度值 > 125(灰色)爲 125(灰色),其餘爲保持原來顏色
        // 第4個參數 maxval 的值,不會影響結果
        Imgproc.threshold(src,dst,125,0,Imgproc.THRESH_TRUNC);
        this.saveImage(this.save_dir + "/image_thresh_3.png",dst);

        // 像素灰度值 > 125(灰色)保持不變,其餘爲0
        // 第4個參數 maxval 的值,不會影響結果
        Imgproc.threshold(src,dst,125,0,Imgproc.THRESH_TOZERO);
        this.saveImage(this.save_dir + "/image_thresh_4.png",dst);

        // 像素灰度值 > 125(灰色)爲 0,其餘保持不變
        // 第4個參數 maxval 的值,不會影響結果
        Imgproc.threshold(src,dst,125,0,Imgproc.THRESH_TOZERO_INV);
        this.saveImage(this.save_dir + "/image_thresh_5.png",dst);
    }

    /**--------------------*
     *  第二節 adaptiveThreshold
     **--------------------*/

    /**
     * 自適應閾值操做
     */
    @Test
    public void testAdaptiveThreshold(){

        /*
         * 原文地址: https://docs.opencv.org/3.0-beta/modules/imgproc/doc/miscellaneous_transformations.html?highlight=adaptivethreshold
         *
         * 原型方法
         *      adaptiveThreshold(Mat src, Mat dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)
         *
         *      參數說明:
         *          src : Mat 輸入圖像 單通道 8位圖像
         *          dst : Mat 輸出圖像 閾值操做結果填充在此圖像
         *          maxValue : double 分配給知足條件的像素的非零值
         *          adaptiveMethod : int 自定義使用的閾值算法,ADAPTIVE_THRESH_MEAN_C 、 ADAPTIVE_THRESH_GAUSSIAN_C
         *              -- ADAPTIVE_THRESH_MEAN_C 時,T(x,y) = blockSize * blockSize【b】
         *                  blockSize【b】= 鄰域內(x,y) - C
         *              -- ADAPTIVE_THRESH_GAUSSIAN_C 時,T(x,y) = blockSize * blockSize【b】
         *                  blockSize【b】= 鄰域內(x,y) - C與高斯窗交叉相關的加權總和
         *
         *          thresholdType : int 閾值類型,只能是THRESH_BINARY 、 THRESH_BINARY_INV
         *              -- THRESH_BINARY 時, src(x,y) > T(x,y) ? maxValue : 0 。當前像素點的灰度值 > T(x,y) 則爲 maxValue,反之爲0
         *              -- THRESH_BINARY_INV 時, src(x,y) > T(x,y) ? 0 : maxValue 。當前像素點的灰度值 > T(x,y) 則爲 0,反之爲maxValue
         *              >>>>> T(x,y) 根據 adaptiveMethod 算法計算出的像素閾值。<<<<<
         *
         *          blockSize : int 用來計算閾值的鄰域尺寸 3,5,7等等,奇數
         *          C : double 減去平均值或加權平均值的常數,一般狀況下,它是正的,但也多是零或負。
         *
         */

        // blocksize 和 C 最關鍵, 須要不斷的調整來找到最佳的值
        // blocksize 就是區域,以一個像素點輻射周圍的範圍來找閾值,在通用處理中,設置一個較大的居中值便可,須要提取文字等信息,反正控制在10之內最好。
        // 在設置 C 的時候,默認我會把 maxValue 設置爲255(白色),
        // 當 C 爲正數,會過濾掉灰色區域,最終是白底,黑字。
        // 爲 C 爲負數,會過濾掉白色區域,文字區域在 blockSize 範圍內的白色保留, 這樣就變成了 黑底白字。也就是取反。

        Mat src = Imgcodecs.imread(this.p_test_file_path + "/mao.jpg",Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
        this.saveImage(this.save_dir + "/image_process_adaptiveThreshold_0.png",src);

        Mat dst = new Mat();

        Imgproc.adaptiveThreshold(src,dst,255,Imgproc.ADAPTIVE_THRESH_MEAN_C , Imgproc.THRESH_BINARY,13,5);
        this.saveImage(this.save_dir + "/image_process_adaptiveThreshold_1.png",dst);

        Imgproc.adaptiveThreshold(src,dst,255,Imgproc.ADAPTIVE_THRESH_MEAN_C , Imgproc.THRESH_BINARY_INV,13,5);
        this.saveImage(this.save_dir + "/image_process_adaptiveThreshold_2.png",dst);

        Imgproc.adaptiveThreshold(src,dst,255,Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C , Imgproc.THRESH_BINARY,13,5);
        this.saveImage(this.save_dir + "/image_process_adaptiveThreshold_3.png",dst);

        Imgproc.adaptiveThreshold(src,dst,255,Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C , Imgproc.THRESH_BINARY_INV,13,5);
        this.saveImage(this.save_dir + "/image_process_adaptiveThreshold_4.png",dst);

    }

}

部分效果展現

灰度原圖:git

輸入圖片說明

Threshold

Threshold-1 【THRESH_BINARY】:github

OpenCV3 Threshold、adaptiveThreshold JAVA OpenCV專題學習11

Threshold-2 【THRESH_BINARY_INV】:算法

OpenCV3 Threshold、adaptiveThreshold JAVA OpenCV專題學習11

Threshold-3 【THRESH_TRUNC】:函數

OpenCV3 Threshold、adaptiveThreshold JAVA OpenCV專題學習11

Threshold-4 【THRESH_TOZERO】:學習

OpenCV3 Threshold、adaptiveThreshold JAVA OpenCV專題學習11

Threshold-5 【THRESH_TOZERO_INV】:this

OpenCV3 Threshold、adaptiveThreshold JAVA OpenCV專題學習11

adaptiveThreshold

算法 ADAPTIVE_THRESH_MEAN_C

adaptiveThreshold-1 【THRESH_BINARY】:code

Imgproc.adaptiveThreshold(src,dst,255,Imgproc.ADAPTIVE_THRESH_MEAN_C , Imgproc.THRESH_BINARY,13,5);

OpenCV3 Threshold、adaptiveThreshold JAVA OpenCV專題學習11

adaptiveThreshold-2 【THRESH_BINARY_INV】:orm

Imgproc.adaptiveThreshold(src,dst,255,Imgproc.ADAPTIVE_THRESH_MEAN_C , Imgproc.THRESH_BINARY_INV,13,5);

OpenCV3 Threshold、adaptiveThreshold JAVA OpenCV專題學習11

算法 ADAPTIVE_THRESH_GAUSSIAN_C

adaptiveThreshold-3 【THRESH_BINARY】:

Imgproc.adaptiveThreshold(src,dst,255,Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C , Imgproc.THRESH_BINARY,13,5);

OpenCV3 Threshold、adaptiveThreshold JAVA OpenCV專題學習11

adaptiveThreshold-4 【THRESH_BINARY_INV】:

Imgproc.adaptiveThreshold(src,dst,255,Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C , Imgproc.THRESH_BINARY_INV,13,5);

OpenCV3 Threshold、adaptiveThreshold JAVA OpenCV專題學習11

廣告欄: 歡迎關注個人 我的博客

相關文章
相關標籤/搜索