画像内の複数の長方形の境界ボックス内にしきい値を適用するにはどうすればよいですか?



How Apply Threshold Within Multiple Rectangular Bounding Boxes An Image



解決:

を使用した色のしきい値処理cv2.inRange()はここで機能するはずです。緑のエリアを隔離したいと思います

これが主なアイデアです



  • RBGよりも色を表現する方が簡単なので、画像をHSV形式に変換します
  • 下限/上限しきい値で色のセグメンテーションを実行します

マスクを取得した後、形態学的操作を実行してノイズを平滑化または除去することもできます。


ここに画像の説明を入力してください



import numpy as np import cv2 image = cv2.imread( '1.jpg')result = image.copy()image = cv2.cvtColor(image、cv2.COLOR_BGR2HSV)lower = np.array([18、0、0] )upper = np.array([179、255、255])mask = cv2.inRange(image、lower、upper)result = cv2.bitwise_and(result、result、mask = mask)cv2.imshow( 'result'、result )cv2.imwrite( 'result.png'、result)cv2.waitKey()

HSV色しきい値スクリプトを使用して、目的の色範囲を分離できます

ここに画像の説明を入力してください

import cv2 import sys import numpy as np def none(x):pass#ウィンドウを作成しますcv2.namedWindow( 'image')#色を変更するためのトラックバーを作成しますcv2.createTrackbar( 'HMin'、 'image'、0,179、nothing)# Opencvの色相は0-179ですcv2.createTrackbar( 'SMin'、 'image'、0,255、nothing)cv2.createTrackbar( 'VMin'、 'image'、0,255、nothing)cv2.createTrackbar( 'HMax'、 'image '、0,179、nothing)cv2.createTrackbar(' SMax '、' image '、0,255、nothing)cv2.createTrackbar(' VMax '、' image '、0,255、nothing)#MAXHSVトラックバーのデフォルト値を設定します。 cv2.setTrackbarPos( 'HMax'、 'image'、179)cv2.setTrackbarPos( 'SMax'、 'image'、255)cv2.setTrackbarPos( 'VMax'、 'image'、255)#初期化してHSV min /最大値の変更hMin = sMin = vMin = hMax = sMax = vMax = 0 phMin = psMin = pvMin = phMax = psMax = pvMax = 0 img = cv2.imread( '1.jpg')output = img waitTime = 33 while(1 ):#すべてのトラックバーの現在の位置を取得hMin = cv2.getTrackbarPos( 'HMin'、 'image')sMin = cv2.getTrackbarPos( 'SMin'、 'image')vMin = cv2.getTrackbarPos( 'VMin'、 'image' )hMax = cv2.getTrackbarPos( 'HMax'、 'image')sMax = cv2.getTrackbarPos( 'SMax'、 'image')vMax = cv2.getTrackbarPos( 'VMax'、 'image')#最小および最大HSV値を設定します表示するにはlower = np.array([hMin、sMin、vMin])upper = np.array([hMax、sMax、vMax])#HSVイメージとしきい値を範囲内に作成します。 hsv = cv2.cvtColor(img、cv2.COLOR_BGR2HSV)mask = cv2.inRange(hsv、lower、upper)output = cv2.bitwise_and(img、img、mask = mask)#HSV値に変更がある場合に出力if( (phMin!= hMin)|(psMin!= sMin)|(pvMin!= vMin)|(phMax!= hMax)|(psMax!= sMax)|(pvMax!= vMax)):print( '(hMin =% d、sMin =%d、vMin =%d)、(hMax =%d、sMax =%d、vMax =%d) '%(hMin、sMin、vMin、hMax、sMax、vMax))phMin = hMin psMin = sMin pvMin = vMin phMax = hMax psMax = sMax pvMax = vMax#出力画像を表示cv2.imshow( 'image'、output)#ビデオのフリーズを防ぐために長く待ちます。 if cv2.waitKey(waitTime)&0xFF == ord( 'q'):break cv2.destroyAllWindows()

これが元の画像の結果です



ここに画像の説明を入力してください


TensorFlow検出では、予測の実行後に取得する出力ディクショナリに「detection_scores」というフィールドがあります。

output_dict = sess.run(tensor_dict、feed_dict = {image_tensor:image})

その上にしきい値を設定し、

indexs = np.where(output_dict ['detection_scores']> 0.5)

ボックス、つまりoutput_dict ['detection_boxes']は、前の手順でフィルタリングした特定のインデックスでのみ使用してください。

[編集]コメントでの議論の後にコードを追加する

#画像をhsvに変換しますhsv = cv2.cvtColor(frame、cv2.COLOR_BGR2HSV)#それに応じて以下の数値を調整しますlower_green = np.array([60、100、50])upper_green = np.array([60、255、255 ])mask = cv2.inRange(hsv、lower_green、upper_green)res = cv2.bitwise_and(frame、frame、mask = mask)#resには出力マスクされた画像があります

[編集]質問で与えられた実際の画像で編集する

img = cv2.imread( 'idJyc.jpg')lower_green = np.array([0、10、0])upper_green = np.array([255、100、255])マスク= cv2.inRange(img、lower_green、 upper_green)mask = np.abs(255-mask)res = cv2.bitwise_and(img、img、mask = mask)cv2.imshow( 'a'、res)cv2.waitKey(0)

参照用に出力画像を追加します。

ここに画像の説明を入力してください


ニューラルネットワークの適用に精通していて、十分なデータがある場合。このタスクは、セグメンテーションに最適です。

U-Netをお勧めします。 少量のラベル付きデータ トレーニング用。それも 少ない操作で高速 比較的複雑度の低いこのタスクの場合。また、さまざまなタスクで優れたパフォーマンスを示しています。

また、この場合はゼブラフィッシュの心臓セグメンテーション用の完全なコードパイプラインを見つけましたが、データの準備方法(ラベリングツールの提案など)とモデルのトレーニング方法を説明するのに良い仕事をしたと思います。

また、一歩後退して、タスクを最初からセグメンテーションタスクとして解釈することも考えられます。特にU-Netの場合、同じ画像内の複数のインスタンスをセグメント化することは問題ではありません。