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

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

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

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

Python

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

Q&A

解決済

1回答

8241閲覧

大きいもの2つだけラベリング処理したい

0126tami

総合スコア60

OpenCV

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

Python

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

0グッド

1クリップ

投稿2019/11/25 09:59

編集2019/11/25 10:57

イメージ説明
イメージ説明

大きいものから2つだけラベリング処理がされるようにしたいです。

import cv2 import numpy as np import sys # 画像の読み込み img = cv2.imread('syaeidilate.png') # グレースケール化 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # ラベリング処理(詳細版) label = cv2.connectedComponentsWithStats(gray) # オブジェクト情報を項目別に抽出 n = label[0] - 1 data = np.delete(label[2], 0, 0) center = np.delete(label[3], 0, 0) # ラベリング結果書き出し用に二値画像をカラー変換 color_src = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR) # オブジェクト情報を利用してラベリング結果を表示 for i in range(n): # 各オブジェクトの外接矩形を赤枠で表示 x0 = data[i][0] y0 = data[i][1] x1 = data[i][0] + data[i][2] y1 = data[i][1] + data[i][3] cv2.rectangle(color_src, (x0, y0), (x1, y1), (0, 0, 255)) # 各オブジェクトの重心座標をに黄文字で表示 cv2.putText(color_src, "X: " + str(int(center[i][0])), (x1 - 10, y1 + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 255)) cv2.putText(color_src, "Y: " + str(int(center[i][1])), (x1 - 10, y1 + 30), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 255)) # 画像の保存 cv2.imwrite('syaeilbl.png', color_src)

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

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

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

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

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

tiitoi

2019/11/25 10:03

処理前の元画像を追記していただけますか
0126tami

2019/11/25 10:58

すみません、忘れていました。  追加しました
fana

2019/11/25 11:29

個々の連結領域の大きさはラベリングした結果としてわかるのでは…
guest

回答1

0

ベストアンサー

connectedComponentsWithStats() が返すラベル情報の3列目が幅、4列目が高さを表すので、幅 * 高さで各ラベルの面積を計算し、argsort() で小さい順にソートした際のインデックスを取得し、argsort()[-3:-1] で後ろから3番目 ~ 2番目 (つまり、2番目、3番目に大きいラベルのインデックス) を取得すればよいです。(1番大きいのは背景なので除く)

python

1### 追加した部分1 2stats = label[2] 3area = stats[:, cv2.CC_STAT_WIDTH] * stats[:, cv2.CC_STAT_HEIGHT] 4top2_idx = area.argsort()[-3:-1] # 2番目、3番めに面積が大きいラベル (1番目は背景なので除く)

コード全体

python

1import cv2 2import numpy as np 3import sys 4 5# 画像の読み込み 6img = cv2.imread('syaeidilate.png') 7 8# グレースケール化 9gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 10 11# ラベリング処理(詳細版) 12label = cv2.connectedComponentsWithStats(gray) 13 14### 追加した部分1 15stats = label[2] 16area = stats[:, cv2.CC_STAT_WIDTH] * stats[:, cv2.CC_STAT_HEIGHT] 17top2_idx = area.argsort()[-3:-1] # 2番目、3番めに面積が大きいラベル (1番目は背景なので除く) 18 19# オブジェクト情報を項目別に抽出 20data = label[2] 21center = label[3] 22 23# ラベリング結果書き出し用に二値画像をカラー変換 24color_src = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR) 25 26# オブジェクト情報を利用してラベリング結果を表示 27for i in top2_idx: 28 # 各オブジェクトの外接矩形を赤枠で表示 29 x0 = data[i][0] 30 y0 = data[i][1] 31 x1 = data[i][0] + data[i][2] 32 y1 = data[i][1] + data[i][3] 33 cv2.rectangle(color_src, (x0, y0), (x1, y1), (0, 0, 255)) 34 35 36 37 38 # 各オブジェクトの重心座標をに黄文字で表示 39 cv2.putText(color_src, "X: " + str(int(center[i][0])), (x1 - 10, y1 + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 255)) 40 cv2.putText(color_src, "Y: " + str(int(center[i][1])), (x1 - 10, y1 + 30), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 255)) 41 42 43 44# 画像の保存 45cv2.imwrite('syaeilbl.png', color_src)

投稿2019/11/25 11:43

tiitoi

総合スコア21956

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

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

0126tami

2019/11/25 11:53

argsort() で小さい順にソートということでしたが大きい順にソートするすべはないのでしょうか?
tiitoi

2019/11/25 12:00 編集

python の組み込み関数 sorted では reversed 引数で降順ソート、昇順ソートを切り替えられるのですが、numpy のソート関数はそのような機能はないので、ソートしたあとに順番は逆にするコードを1行追加するか、小さい順にソートして後ろからとってくるか (小さい順にソートしたということは後ろから見ると大きい順になっている) しかありません。
0126tami

2019/11/25 12:01

そうなのですね  ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問