少し前にOpenCVを利用する機会があったので, 今更ながらまとめていこうと思った. 今回はラベリングをする.
用意するもの
OpenCV-3.4.3 (Versionは特にこだわる必要はないかも)
今回はUbuntuでプログラムを動かしているが, WindowsでもVisual Studioを使えば動かすことができる. 環境構築については今回は割愛する.
ラベリングですること
ざっくり説明すると
- 1 画像をグレースケールで読み込む
- 2 2値化
- 3 必要に応じて収縮・膨張
- 4 ビット反転
- 5 ラベリング
- 6 好きな形で出力
こんな感じで今回はコーディングした.
ソースコード
Main.cpp
#include<opencv2/opencv.hpp>
int main() {
cv::Mat img;
cv::Mat img_out;
img = cv::imread("sample.jpeg", 1);
cv::cvtColor(img, img,cv::COLOR_RGB2GRAY);
//下2つの処理は必要に応じて適用する
//入力画像の収縮
//cv::erode(img_out, img_out, cv::Mat(), cv::Point(-1, -1), 3);
//入力画像の膨張
//cv::dilate(img_out, img_out, cv::Mat(), cv::Point(-1, -1), 3);
//大津の手法を用いているので, 閾値を指定する必要はない
cv::threshold(img, img_out, 0, 255, cv::THRESH_BINARY|cv::THRESH_OTSU);
//thresholdかinRangeどちらでもいい
//cv::inRange(img, 124, 254, img_out);
cv::bitwise_not(img_out, img_out);
cv::Mat img_lab;
//ラベリング
int nlabel=cv::connectedComponents(img_out,img_lab);
for (int i = 0; i < nlabel; i++) {
//ラベルiを取り出す
cv::compare(img_lab, i, img_out, cv::CMP_EQ);
//出力画像の保存
imwrite("out" + std::to_string(i) + ".jpg", img_out);
cv::imshow("Labelling", img_out);
cv::waitKey(0);//入力待ち
}
return 0;
}
うまく行きそうな画像を拾って来たので簡単な処理で, そこそこきれいにラベリングできた.