0

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,

HJA24
  • 410
  • 2
  • 11
  • 33
  • You can also check whether *cv2.equalizeHist(src)* works or not. From my previous experience in MRI images, it worked perfectly fine for me in those kind of bright parts. – Physicing Sep 29 '19 at 18:17
  • Without the original image, we can't experiment. –  Sep 29 '19 at 18:55

1 Answers1

1

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.

J.D.
  • 4,511
  • 2
  • 7
  • 20