私たちのコメントに従って、できることはnumpy
配列のリストを作成することです。各要素は、各オブジェクトの輪郭の内部を表す強度です。具体的には、輪郭ごとに、輪郭の内部を塗りつぶすバイナリ マスクを作成し、(x,y)
塗りつぶされたオブジェクトの座標を見つけてから、画像にインデックスを付けて強度を取得します。
コードをどのように設定したかは正確にはわかりませんが、 と呼ばれるグレースケールの画像があると仮定しましょうimg
。グレースケール画像で機能するため、画像をグレースケールに変換する必要がある場合がありcv2.findContours
ます。cv2.findContours
これで、通常どおり呼び出します。
import cv2
import numpy as np
#... Put your other code here....
#....
# Call if necessary
#img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Call cv2.findContours
contours,_ = cv2.findContours(img, cv2.RETR_LIST, cv2.cv.CV_CHAIN_APPROX_NONE)
contours
は 3Dnumpy
配列のリストになり、それぞれのサイズN x 1 x 2
はN
各オブジェクトの輪郭点の総数です。
そのため、次のようにリストを作成できます。
# Initialize empty list
lst_intensities = []
# For each list of contour points...
for i in range(len(contours)):
# Create a mask image that contains the contour filled in
cimg = np.zeros_like(img)
cv2.drawContours(cimg, contours, i, color=255, thickness=-1)
# Access the image pixels and create a 1D numpy array then add to list
pts = np.where(cimg == 255)
lst_intensities.append(img[pts[0], pts[1]])
輪郭ごとに、空白の画像を作成し、この空白の画像に塗りつぶされた輪郭を描画します。thickness
パラメータを -1 に指定することで、等高線が占める領域を埋めることができます。等高線の内部を 255 に設定しました。その後、numpy.where
特定の条件に一致する配列内のすべての行と列の位置を見つけるために使用します。この場合、255 に等しい値を見つけたいと考えています。その後、これらのポイントを使用して画像にインデックスを付け、輪郭の内側にあるピクセル強度を取得します。
lst_intensities
numpy
各要素が各オブジェクトの輪郭の内部に属する強度を提供する1D 配列のリストが含まれています。各配列にアクセスするには、アクセスしたい輪郭がlst_intensities[i]
どこにあるかを実行するだけです。i