前提・実現したいこと
Pythonで画像処理を初めて半年です。
OpenCVのConectedComponetsを用いて、画像をあるセグメント3つに分けるところまではできたのですが、
その時の色がランダムになってしまいます。その時の色を、セグメントの位置に応じて指定する方法や参考になるサイトがあれば、
教えて頂きたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答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総合スコア21960
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/14 06:39
2018/09/14 06:48
2018/09/14 07:14