画像から特定の色を抽出したい
お世話になります。画像から赤、緑の色を抽出して色の点群を矩形で囲みたいのですが、HSVのどのパターンを試してもうまくいきません。今は青はうまくいっていますが一部ずれていたり、関係のないところにもかかっています。プログラムのような色の探し方が悪いのか、別な範囲を変えたらいいのかよくわからないでいます。どなたか解決法を教えてください。よろしくお願いいたします。
col_img=cv2.imread("/home/pi/seisaku/2.jpg",cv2.IMREAD_COLOR)
col_img=cv2.resize(col_img,None,fx=3,fy=3)
img=cv2.cvtColor(col_img,cv2.cv.CV_BGR2HSV)
h=copy.copy(img[:,:,0])
s=copy.copy(img[:,:,1])
v=copy.copy(img[:,:,2])
Blue=np.zeros(col_img.shape,dtype=np.uint8)
Red=np.zeros(col_img.shape,dtype=np.uint8)
Green=np.zeros(col_img.shape,dtype=np.uint8)
Blue[((h > 200) | (h < 260)) & (s > 100)]=255
Red[((h < 30) | (h > 280)) & (s > 128)]=255
Green[((h > 80) | (h < 230)) & (s > 170)]=255
for col in [Red,Blue,Green]:
gray = cv2.cvtColor(col, cv2.COLOR_BGR2GRAY)
retval, bw = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
cv2.imwrite("bw.jpg",bw)
contours,_= cv2.findContours(bw, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
##各輪郭に対する処理
for i in range(0, len(contours)):
# 輪郭の領域を計算
area = cv2.contourArea(contours[i])
# 外接矩形
if( len(contours[i]) > 0 )&(100<area<400):
rect = contours[i]
x, y, w, h = cv2.boundingRect(rect)
if abs(w-h)<5:
cv2.rectangle(col_img, (x, y), (x + w, y + h), (255,0 ,0), 2)
#print(int(x+w/2),int(y+h/2))
cv2.imwrite("aux.jpg",col_img)
#cv2.waitKey(0)