将图像转换为二进制图像不会显示足球场的白线

问题描述 投票:0回答:1

我受到以下blogpost的启发,但是我在第2/3步中苦苦挣扎。我想基于阈值从灰色图像创建二进制图像,并最终在图像上显示所有白线。我期望的输出如下所示:

enter image description here

首先,我想使用颜色阈值和形态来隔离足球场。

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)

这将提供以下输出:

enter image description here

到目前为止,我对结果感到满意,但是由于阴影很大,所以我在grayscale图片时仍在进行图像处理。结果,二值化阈值基于左上角的晴天部分,而不是足球场周围的白线。

enter image description here

按照tutorials上的方法,对于简单的阈值处理,我得到以下输出:enter image description here

和自适应阈值:

enter image description here

最后,是大津的门槛:

enter image description here

如何确定白线变得更清晰?我当时正在考虑裁剪框架,因此我只能看到该区域,然后使用基于白色的遮罩。不幸的是,这没有解决。

非常感谢您的帮助,

python opencv image-processing cv2 image-thresholding
1个回答
0
投票

您可以修改inRange以也排除饱和色。我没有您的原始图片,所以我使用了您的中间结果:

enter image description here

inRange的结果是所需的二进制图像。我希望您可以使用原始图像获得更好的效果。我在图像中使用了[此脚本]-可以轻松搜索良好的HSV值。

© www.soinside.com 2019 - 2024. All rights reserved.