将图像转换为二进制不显示足球场的白线
Convert image to binary doesn't shows white lines of a soccer field
我受到以下 blogpost 的启发,但是我在第 2/3 步中遇到困难。
我想根据阈值从灰度图像创建二值图像,并最终在图像上显示所有白线。我想要的输出如下所示:
首先,我想通过使用颜色阈值和形态来隔离足球场。
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)
这给出了以下输出:
到目前为止,我对结果很满意,但是由于阴影太大,我在 grayscale
图片时难以处理图像。因此,二进制阈值是基于左上角的阳光部分,而不是足球场周围的白线。
按照 tutorials 上的方法,我得到以下简单阈值输出:
和自适应阈值:
最后,Otsu 的阈值:
如何确保白线变得更加明显?我正在考虑裁剪框架,所以我只能看到场,然后使用基于白色的蒙版。不幸的是,这没有成功。
非常感谢您的帮助,
您可以修改 inRange
以同时排除饱和色(即绿色)。我没有你的原始图像,所以我使用了你的中间结果:
inRange
的结果就是你想要的二进制图像。我希望你能用原始图像取得更好的效果。我在图像中使用了 this script - 这使得搜索好的 HSV 值变得容易。
我受到以下 blogpost 的启发,但是我在第 2/3 步中遇到困难。 我想根据阈值从灰度图像创建二值图像,并最终在图像上显示所有白线。我想要的输出如下所示:
首先,我想通过使用颜色阈值和形态来隔离足球场。
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)
这给出了以下输出:
到目前为止,我对结果很满意,但是由于阴影太大,我在 grayscale
图片时难以处理图像。因此,二进制阈值是基于左上角的阳光部分,而不是足球场周围的白线。
按照 tutorials 上的方法,我得到以下简单阈值输出:
和自适应阈值:
最后,Otsu 的阈值:
如何确保白线变得更加明显?我正在考虑裁剪框架,所以我只能看到场,然后使用基于白色的蒙版。不幸的是,这没有成功。
非常感谢您的帮助,
您可以修改 inRange
以同时排除饱和色(即绿色)。我没有你的原始图像,所以我使用了你的中间结果:
inRange
的结果就是你想要的二进制图像。我希望你能用原始图像取得更好的效果。我在图像中使用了 this script - 这使得搜索好的 HSV 值变得容易。