關於 JAVA 學習 OpenCV 的內容,函數講解。內容我均整理在 GitHubd的【OpenCV3-Study-JAVA】html
下面代碼中所需的項目結構,圖片,請訪問 GitHub 獲取。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-1 【THRESH_BINARY】:github
Threshold-2 【THRESH_BINARY_INV】:算法
Threshold-3 【THRESH_TRUNC】:函數
Threshold-4 【THRESH_TOZERO】:學習
Threshold-5 【THRESH_TOZERO_INV】:this
adaptiveThreshold-1 【THRESH_BINARY】:code
Imgproc.adaptiveThreshold(src,dst,255,Imgproc.ADAPTIVE_THRESH_MEAN_C , Imgproc.THRESH_BINARY,13,5);
adaptiveThreshold-2 【THRESH_BINARY_INV】:orm
Imgproc.adaptiveThreshold(src,dst,255,Imgproc.ADAPTIVE_THRESH_MEAN_C , Imgproc.THRESH_BINARY_INV,13,5);
adaptiveThreshold-3 【THRESH_BINARY】:
Imgproc.adaptiveThreshold(src,dst,255,Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C , Imgproc.THRESH_BINARY,13,5);
adaptiveThreshold-4 【THRESH_BINARY_INV】:
Imgproc.adaptiveThreshold(src,dst,255,Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C , Imgproc.THRESH_BINARY_INV,13,5);
廣告欄: 歡迎關注個人 我的博客