opencv_ex12-讀取圖檔時轉灰階IMREAD_GRAYSCALE、彩色轉灰階cvtColor、區域門閥值灰階轉二值化adaptiveThreshold、利用開操作偵測直線、利用開操作偵測橫線、利用開操作實現簡易驗證碼圖像過濾保留文字

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;
}

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *