Search code examples
pythonimage-processingopencvimage-thresholding

Convert image to binary doesn't shows white lines of a soccer field


I am inspired by the following blogpost, however I am struggling with step 2/3. I want to creates a binary image from a gray image based on the threshold values and ultimately displaying all white lines on the image. My desired output looks as follows:

enter image description here

First, I want to isolate the soccer field by using colour-thresholding and morphology.

def isolate_field(img):
   hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

   # find green pitch
   light_green = np.array([40, 40, 40])
   dark_green = np.array([70, 255, 255])
   mask = cv2.inRange(hsv, light_green, dark_green)

   # removing small noises
   kernel = np.ones((5, 5), np.uint8)
   opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)

   # apply mask over original frame
   return cv2.bitwise_and(frame, frame, mask=opening)

This gives the following output:

enter image description here

I am happy with the results so far, but because of the large shadow I am struggling with the image-processing when I grayscale the picture. As a result, the binary thresholding is based on the sunny part in the upper-left corner instead of the white lines around the soccer field.

enter image description here

Following the methodology on the tutorials I get the following output for the simple thresholding: enter image description here

and adaptive thresholding:

enter image description here

and finally, Otsu's thresholding:

enter image description here

How can I make sure that the white lines become more visible? I was thinking about cropping the frame so I only see the field and then use a mask based on the color white. That didn't work out unfortunately.

Help is much appreciated,


Solution

  • You can modify inRange to also exclude saturated colors (meaning the greens). I don't have your original image, so I used your intermediate result:

    enter image description here

    The result of inRange is the binary image you want. I expect you can achieve better results with the original image. I used this script in the image - which makes it easy to search for good HSV values.