2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

OpenCVを用いてラベリング

Last updated at Posted at 2019-02-04

少し前に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;
}

入力画像
sample.jpeg

出力画像
1
out_0.jpg

2
out_1.jpg

3
out_2.jpg

4
out_3.jpg

5
out_4.jpg

うまく行きそうな画像を拾って来たので簡単な処理で, そこそこきれいにラベリングできた.

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?