質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

7976閲覧

画像をラベリングし、その時の色をセグメントの位置に応じて指定する方法

masukin

総合スコア34

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/09/14 05:31

編集2018/09/14 05:35

前提・実現したいこと

Pythonで画像処理を初めて半年です。
OpenCVのConectedComponetsを用いて、画像をあるセグメント3つに分けるところまではできたのですが、
その時の色がランダムになってしまいます。その時の色を、セグメントの位置に応じて指定する方法や参考になるサイトがあれば、
教えて頂きたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

connectedComponents() の返り値について

connectedComponents() の返す labels の画素は0, 1, 2, ... というラベルの値が入っているだけです。ただし、0 は背景ラベルです。
(print() して確認してみてください。色ではなく、ラベルの値です。)

そのラベリング結果を見て、画像の色付けを行えばよいです。

イメージ説明

サンプルで使用した画像

python

1import cv2 2import numpy as np 3import matplotlib.pyplot as plt 4 5# 画像をグレースケール形式で読み込む。 6src = cv2.imread('test.png') 7 8# 連結成分のラベリングを行う。 9gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) 10num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(gray) 11 12# ラベリング結果 13print('number of labels', num_labels) 14print(labels.shape, labels.dtype) # (362, 420) int32 15plt.imshow(labels) 16plt.show() 17 18# ラベルに応じて、色をつけた画像を作成する。 19dst = np.zeros_like(src) 20dst[labels == 0] = [0, 255, 0] # 背景ラベル 21dst[labels == 1] = [255, 255, 0] # ラベル1 22dst[labels == 2] = [0, 255, 255] # ラベル2 23dst[labels == 3] = [100, 255, 255] # ラベル3 24dst[labels == 4] = [255, 100, 100] # ラベル4 25dst[labels == 5] = [0, 100, 0] # ラベル5 26 27plt.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)) 28plt.show()

イメージ説明

セグメントの位置に応じて色を指定したい。

その時の色を、セグメントの位置に応じて指定する方法や参考になるサイトがあれば、教えて頂きたいです。

connectedComponents() ではなく、connectedComponentsWithStats() を使うと、各ラベルの位置や大きさが得られます。
これを用いて、先ほどの色を決めればよいでしょう。

python

1import cv2 2import numpy as np 3import matplotlib.pyplot as plt 4 5# 画像をグレースケール形式で読み込む。 6src = cv2.imread('test.png') 7 8# 連結成分のラベリングを行う。 9gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) 10num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(gray) 11 12# ラベリング結果 13print('number of labels', num_labels) 14print(labels.shape, labels.dtype) # (362, 420) int32 15 16plt.imshow(labels) 17plt.axis('off') 18 19for i, row in enumerate(stats): 20 print('label {}'.format(i)) 21 print(' topleft: ({}, {})'.format(row[cv2.CC_STAT_LEFT], row[cv2.CC_STAT_TOP])) 22 print(' size: ({} px, {} px)'.format(row[cv2.CC_STAT_WIDTH], row[cv2.CC_STAT_HEIGHT])) 23 print(' area: {}'.format(row[cv2.CC_STAT_AREA])) 24 plt.text(row[cv2.CC_STAT_LEFT], row[cv2.CC_STAT_TOP], 25 'label {}'.format(i), color='w', fontsize=12) 26 27plt.show()

イメージ説明

詳細は公式APIリファレンスを参照してください。

投稿2018/09/14 06:04

編集2018/09/14 06:45
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masukin

2018/09/14 06:39

ご回答有り難うございます!! connectedComponentsWithStats() のことは知らなかったのでとても助かりました。 有り難うございます。 ところでもう一つだけ質問なのですが、下のプログラムを実行した時に、さらに下のようになりました。 何が起こっているのでしょうか。もしアドバイスがあれば頂きたいです。涙 # ラベルに応じて、色をつけた画像を作成する。 dst = np.zeros_like(src) dst[labels == 0] = [0, 255, 0] # 背景ラベル dst[labels == 1] = [255, 255, 0] # ラベル1 dst[labels == 2] = [0, 255, 255] # ラベル2 dst[labels == 3] = [100, 255, 255] # ラベル3 dst[labels == 4] = [255, 100, 100] # ラベル4 dst[labels == 5] = [0, 100, 0] # ラベル5 エラーコード boolean index did not match indexed array along dimension 0; dimension is 600 but corresponding boolean dimension is 3
tiitoi

2018/09/14 06:48

使用した画像を回答に追記しました。src は (H, W, 3) の numpy 配列を想定しています。 エラーが発生したときは、まずその周辺の値を print してみましょう。 numpy 配列の場合は、print(array.shape, array.dtype) で形状と型を print で確認すれば、たいだい原因がわかります。 まずエラーが起こる直前で以下を確認してください。 ``` print(src.shape, src.dtype) print(labels.shape, labels.dtype) ```
masukin

2018/09/14 07:14

分かりました。私が使っていた画像は(H, W)になっていたのでエラーになっていたと思われます。 本当に有り難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問