
解決したいこと
参考サイト:OpenCV を使用して画像中のオブジェクトの輪郭を検出する方法
cv2.connectedComponentsWithStatsを使ってラベリングした後、ラベリングした箇所のカラーをそれぞれ変更したいです。
この時ラベリング全ての色を変更するのではなく座標ごとに色を変えたいのですが、どうすれば良いでしょうか?
コード
python
1import cv2 2import numpy as np 3import random 4 5# load image, change color spaces, and smoothing 6img = cv2.imread('tulip.jpg') 7img_HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 8img_HSV = cv2.GaussianBlur(img_HSV, (9, 9), 3) 9 10# detect tulips 11img_H, img_S, img_V = cv2.split(img_HSV) 12_thre, img_flowers = cv2.threshold(img_H, 140, 255, cv2.THRESH_BINARY) 13cv2.imwrite('tulips_mask.jpg', img_flowers) 14 15# find tulips 16nlabels, labels = cv2.connectedComponents(img_flowers) 17 18 19img = np.zeros(img.shape[0:3]) 20height, width = img.shape[0:2] 21cols = [] 22 23# background is label=0, objects are started from 1 24for i in range(1, nlabels): 25 cols.append(np.array([random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)])) 26 27for i in range(1, nlabels): 28 img[labels == i, ] = cols[i - 1] 29 30# save 31cv2.imwrite('tulips_object.jpg', img)
上記のコードは参考サイトのものです。最後から4行目の
python
1img[labels == i, ] = cols[i - 1]
この処理でラベリングされた番号ごとにカラーが変更していると思いますが、ここで
python
1img[labels == i, ] [0]= cols[i - 1]
としてラベリングされた番号の特定の座標の色をかえたいのですが、どうもうまくいきません。
これを解決する方法を教えていただけたら幸いです。
他の解決法
もし、上記の方法がダメな際はラベリングされた番号ごとの座標全てを取得する方法でも可能なのかなと考えています。
座標を取得できれば
python
1img[x, y] = cols[i - 1]
とすれば良いかと思うので、こちらの方法でも大丈夫です。
なぜこれをしたいのか
これをしたい理由はラベリングした後に、この画像をマスク画像にして元画像を何かしら処理し、そのときに余分だと判断した箇所は黒色にしたいと考えているからです。
解決策がお分かりでしたら、ぜひお願いいたします。



回答1件
あなたの回答
tips
プレビュー