opencv_ex12-讀取圖檔時轉灰階IMREAD_GRAYSCALE、彩色轉灰階cvtColor、區域門閥值灰階轉二值化adaptiveThreshold、利用開操作偵測直線、利用開操作偵測橫線、利用開操作實現簡易驗證碼圖像過濾保留文字
opencv_ex12-讀取圖檔時轉灰階IMREAD_GRAYSCALE、彩色轉灰階cvtColor、區域門閥值灰階轉二值化adaptiveThreshold、利用開操作偵測直線、利用開操作偵測橫線、利用開操作實現簡易驗證碼圖像過濾保留文字
GITHUB: https://github.com/jash-git/CPP_opencv249_ex
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/ml/ml.hpp> #include <iostream> #include <cstdio> #include <sys/timeb.h> #if defined(WIN32) #define TIMEB _timeb #define ftime _ftime typedef __int64 TIME_T; #else #define TIMEB timeb typedef long long TIME_T; #endif using namespace cv; using namespace std; Mat src00;//input image Mat src01;//GRAY Mat src02;//BIN Mat dst01,dst02,dst03,dst04,dst05; void Pause() { printf("Press Enter key to continue..."); fgetc(stdin); } int main() { src00 = imread("input.png"); if (!src00.data) { printf("could not load image...\n"); } else { namedWindow("color_input", CV_WINDOW_AUTOSIZE); imshow("color_input", src00); cvtColor(src00, src01, CV_BGR2GRAY); namedWindow("gray_input", CV_WINDOW_AUTOSIZE); imshow("gray_input", src01); adaptiveThreshold(~src01, src02, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 11, -2); //區域門閥值 //src:輸入圖,只能輸入8位元單通道圖。 //dst:輸出圖,尺寸大小、深度會和輸入圖相同。 //maxValue:最大值,adaptiveThreshold會將像素分成0和maxValue。 //adaptiveMethod:區域閾值方法:可以選擇ADAPTIVE_THRESH_MEAN_C或ADAPTIVE_THRESH_GAUSSIAN_C,兩者決定閾值的方式不同。 //thresholdType:二值化型態:有THRESH_BINARY和THRESH_BINARY_INV兩種型態可選。 //blockSize:區域尺寸,用幾個像素來決定閾值,只能選擇奇數像3、5、7……等。 PS 線條越粗則數值要越大 //C:常數,計算閾值時,要從平均或加權平均減去的數。 namedWindow("binary_input", CV_WINDOW_AUTOSIZE); imshow("binary_input", src02); //膨脹-輸出的像素值是結構元素覆蓋下輸入圖像的最大像素值 //腐蝕-輸出的像素值是結構元素覆蓋下輸入圖像的最小像素值 // 水平結構元素 Mat hline = getStructuringElement(MORPH_RECT, Size(src00.cols/10, 1), Point(-1, -1)); // 垂直結構元素 Mat vline = getStructuringElement(MORPH_RECT, Size(1, src00.rows/5), Point(-1, -1)); morphologyEx(src02, dst01, CV_MOP_OPEN, vline);//利用開運算保留垂直 namedWindow("binary_input_OPEN_vline", CV_WINDOW_AUTOSIZE); imshow("binary_input_OPEN_vline", dst01); morphologyEx(src02, dst02, CV_MOP_OPEN, hline);//利用開運算保留水平 namedWindow("binary_input_OPEN_hline", CV_WINDOW_AUTOSIZE); imshow("binary_input_OPEN_hline", dst02); //---------------------// // 矩形結構-去除干擾線留下文字 dst03 = imread("chars.png",IMREAD_GRAYSCALE); adaptiveThreshold(~dst03, dst04, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 11, -2); Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1)); Mat temp; erode(dst04, temp, kernel);//腐蝕 dilate(temp, dst05, kernel);//膨脹 //CV_MOP_OPEN:先腐蝕後膨脹-可以去掉小的對象,假設對像是前景色,背景是黑色 namedWindow("binary_chars_OPEN", CV_WINDOW_AUTOSIZE); imshow("binary_chars_OPEN", dst05); } waitKey(0); return 0; }