竞赛中图片转程序易处理的数据结构

前言

很多竞赛都涉及到将图片转成程序容易处理的数据结构(比如数学建模),之前一直没有找到很好的方案,都是自己设计坐标点再使用程序一点点画出来,现在发现可以将图片转为简单的位图,其结果相当于一个值为0或255的二维矩阵,方便后续处理。本文以下图为例,将其最终转为Python可以处理的矩阵:

https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/20210324120436.png
原图

步骤

剪切

题中地图信息是跟题目一起出现的图片,为了方便提取出地图信息,先用windows画图软件或PS将题目文字信息截去,只留地图信息:

https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/20210324120858.png
剪切

去水印

截取后的图片包含了较少噪声(水印),进一步观察后发现图片包含两种主要颜色——代表边界的黑色和背景白色,而水印的颜色的值则与黑白两色相差胜远,使用取色软件得到水印的RGB值在231左右,故可以使用OpenCV的 threshold 方法将图片中RGB值在231附近的颜色都改成白色,即删除了水印1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import cv2
import numpy as np
src_path = "./map.png"
# 读取图片
img_grey = cv2.imread(src_path, cv2.IMREAD_GRAYSCALE)
# 去除水印
img_grey = cv2.threshold(img_grey, 200, 255, cv2.THRESH_BINARY)[1]
cv2.imshow('img_grey', img_grey)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下:

https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/20210324122314.png
去水印

二值化

去除水印后图片已经十分纯粹,但在肉眼不可见的多边形黑色边界处还存在一些灰色地带,因此需要OpenCV的 threshold 方法将图片转为二值化的黑白图片:

1
2
img_binary = cv2.threshold(img_grey, 128, 255, cv2.THRESH_BINARY)[1]
maxH, maxW = img_binary.shape

结果如下:

https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/20210324123816.png
二值化

总结

经过以上操作,便将一个包含许多噪声的图片转化为了程序可以处理的矩阵元素,可以在此基础上方便使用其他算法完成任务。

参考