プログラミング初心者で申し訳ございません。OpenCVを用いてcv2.findContoursで次の画像の金属のフレームの輪郭を綺麗に抽出したいのですけど閾値の数値を変えても上手くいきませんでした。原因は光の反射だと思うのですけどどうすればよろしいのでしょうか?
python
1import cv2 2import numpy as np 3img=cv2.imread('input.jpg') 4gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 5ret,thresh = cv2.threshold(gray,100,250,cv2.THRESH_BINARY) 6contours,hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 7contimg=cv2.drawContours(img,contours,-1,(0,255,0),3) 8cv2.imwrite('output.jpg',img)
途中のGray画像を表示するとどうなるでしょうか?
その画像を見ながら、調整すると良い方法があるかも。
また、対象となるものが、青が強いので、青だけ抽出したら、どうなるでしょう。
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
の後に
cv2.imshow('gray', gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
を実行してみると分かりますが、背景と金属フレームの明るさが近いので、明るさで2値化して背景と分離するのは難しいと思います
この画像のように、背景は色があまり濃くなく(グレーに近い)、輪郭を付けたいものは色が濃い、ということが常に成り立つのなら、それを利用できます
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
↓ 変更
gray=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)[:,:,1]
上手くできました。指導していただき、ありがとうございます。
回答1件
あなたの回答
tips
プレビュー