画像処理(二値化)

二値化について勉強したのでまとめます。

二値化とは、グレースケール画像の画素値を一定の条件で二つの値に振り分けた画像を作成する処理です。

グレースケール画像の一つの画素は、その位置の光の強さを0から255までの256段階で表しています。 その画素一つずつと決められた閾値を比較し、閾値を超えている場合は255(白)閾値以下の場合は0(黒)に分類します。

f:id:ArtificialArts:20180228073308j:plainf:id:ArtificialArts:20180228073337j:plain
グレースケール / 二値化画像(閾値100)

画像内のある位置の画素の変化をグラフにすると、下記のようになります。 縦軸が画素値で赤い線が閾値ですが、赤い線を超えているものは255、赤い線と同じか下回っているものは0になっていることがわかります。

f:id:ArtificialArts:20180228073323j:plain

二値化は必要な情報と不必要な情報を分けることに使用されることが多く、文字認識(OCR)では認識したい文字と背景をうまく分けられるように閾値を調整します。

下記プログラムでは、カラー画像を読み込み、グレースケール化、二値化を行い、元画像・グレースケール画像・二値化画像を表示します。
OpenCvの設定が終わっている前提です)
Thresholdの値(100)を0から255の間で変更することで、出力画像が変わることが確認できます。

C++(OpenCv3.3)

#ifdef _DEBUG
#pragma comment(lib,"opencv_world330d.lib" )
#else
#pragma comment(lib,"opencv_world330.lib" )
#endif
#include <opencv2\opencv.hpp>

int main(int argc, char** argv) 
{
    cv::Mat imgSrc = cv::imread("lena.jpg");
    imshow("original", imgSrc);

    cv::Mat imgGray;
    cv::cvtColor(imgSrc, imgGray, CV_BGR2GRAY);
    imshow("grayscale", imgGray);

    cv::Mat imgDst;
    cv::threshold(imgGray, imgDst, 100, 255, cv::THRESH_BINARY);
    imshow("binary", imgDst);

    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}


C#(OpenCvSharp3-AnyCPU 3.3)

using OpenCvSharp;

static void Main(string[] args)
{
    Mat imgSrc = Cv2.ImRead("lena.jpg");
    Cv2.ImShow("original", imgSrc);

    Mat imgGray = new Mat();
    Cv2.CvtColor(imgSrc, imgGray, ColorConversionCodes.BGR2GRAY);
    Cv2.ImShow("grayscale", imgGray);

    Mat imgDst = new Mat();
    Cv2.Threshold(imgGray, imgDst, 100, 255, ThresholdTypes.Binary);
    Cv2.ImShow("binary", imgDst);

    Cv2.WaitKey(0);
    Cv2.DestroyAllWindows();
}

f:id:ArtificialArts:20180302074524j:plainf:id:ArtificialArts:20180302074529j:plain
二値化画像(閾値50) / 二値化画像(閾値150)