I want to get contour area color range and do some condition for example this is input image: Below is the code to find contours:
import cv2
img = cv2.imread('D:/original.png', cv2.IMREAD_UNCHANGED)
#convert img to grey
img_grey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#set a thresh
thresh = 100
#get threshold image
ret,thresh_img = cv2.threshold(img_grey, thresh, 255, cv2.THRESH_BINARY)
#find contours
contours, hierarchy = cv2.findContours(thresh_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
Now I am trying to get each contour color and write condition for example:
if contours[0] in color range ((100,100,100),(200,200,200)) then drawContour
All the things I'm trying to do are: get each contour area and check if selected contour is in specific color range or not.
CodePudding user response:
In order to extract single contours differentiated by color, the logical way to approach this problem would be to use the different colors and not convert the image to grayscale
.
You can than work on single channels. For instance, for the the blue
channel:
thresh = 100
ret,thresh_img = cv2.threshold(b, thresh, 255, cv2.THRESH_BINARY)
Then with a combination of bit_wise
operations, you can extract a specific contour.
Another approach would be to replace the threshold
operator with the Canny
operator.
thresh1 = 40
thresh2 = 120
#get canny image
thresh_img = cv2.Canny(img[:,:,0], thresh1,thresh2)
#find contours
contours, hierarchy = cv2.findContours(thresh_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
Which yields the following contours:
The use of Canny
as preprocessing for contour is suggested by the