我正在做一个项目,让用户采取手写公式的照片,并将它们发送到我的服务器。我想只留下与数学相关的符号,而不是表格网格。
(1)原始RGB照片
(2)模糊灰度
(3)应用自适应阈值后
**注意:**我希望我的算法处理任何颜色的表格网格。
任何代码片段将不胜感激。提前感谢。
dy2hfwbg1#
Result这是一个很有挑战性的问题,在不知 prop 体是什么样的纸张/线条和墨水组合的情况下,以及输出将用于什么的情况下,我想我应该尝试一下,也许能学到一些东西。我认为有两种方法可以解决这个问题:1.聪明的方法:识别网格,它的颜色,方向,大小,以找到它所占据的图像区域,以便忽略它。这里有一些主要的警告需要解决。例如,页面可能没有被拍摄成平面和正方形(必须考虑到扭曲,扭曲,旋转)。还有一些我们不想删除的线条。1.简单的方法:应用一般的图像处理,除了假设笔总是比网格暗之外,对问题知之甚少,并且输出是二进制的(黑笔/白色页)。我更喜欢第二个,因为它更容易实现,更容易推广。我们首先注意到页面的“白色”实际上是一种不均匀的灰色阴影(如果我们转换为灰度)。CV自适应阈值处理很好地处理了这个问题。它几乎让我们达到了目的。下面的代码将图像分为50 x50像素块来处理光照的不均匀性。在每个块中,我们在应用阈值之前减去中值。这是一个简单的解决方案,但可能是你需要的。我还没有在很多图像上测试过它,阈值和预处理和后处理可能需要调整。如果输入图像变化很大,它将不起作用。或者如果网格相对于油墨太暗。
import cv2 import numpy import sys BLOCK_SIZE = 50 THRESHOLD = 25 def preprocess(image): image = cv2.medianBlur(image, 3) image = cv2.GaussianBlur(image, (3, 3), 0) return 255 - image def postprocess(image): image = cv2.medianBlur(image, 5) # image = cv2.medianBlur(image, 5) # kernel = numpy.ones((3,3), numpy.uint8) # image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel) return image def get_block_index(image_shape, yx, block_size): y = numpy.arange(max(0, yx[0]-block_size), min(image_shape[0], yx[0]+block_size)) x = numpy.arange(max(0, yx[1]-block_size), min(image_shape[1], yx[1]+block_size)) return numpy.meshgrid(y, x) def adaptive_median_threshold(img_in): med = numpy.median(img_in) img_out = numpy.zeros_like(img_in) img_out[img_in - med < THRESHOLD] = 255 return img_out def block_image_process(image, block_size): out_image = numpy.zeros_like(image) for row in range(0, image.shape[0], block_size): for col in range(0, image.shape[1], block_size): idx = (row, col) block_idx = get_block_index(image.shape, idx, block_size) out_image[block_idx] = adaptive_median_threshold(image[block_idx]) return out_image def process_image_file(filename): image_in = cv2.cvtColor(cv2.imread(filename), cv2.COLOR_BGR2GRAY) image_in = preprocess(image_in) image_out = block_image_process(image_in, BLOCK_SIZE) image_out = postprocess(image_out) cv2.imwrite('bin_' + filename, image_out) if __name__ == "__main__": process_image_file(sys.argv[1])
deikduxw2#
OpenCV有一个教程处理从图像中删除网格:“使用形态运算提取水平和垂直线”,OpenCV文档,来源:https://docs.opencv.org/master/dd/dd7/tutorial_morph_lines_detection.html
arknldoa3#
这是一个相当困难的任务。我也有这个问题,我发现解决方案不能100%准确。顺便说一句,就在几天前我看到这个链接。也许它可以帮助。
3条答案
按热度按时间dy2hfwbg1#
Result
这是一个很有挑战性的问题,在不知 prop 体是什么样的纸张/线条和墨水组合的情况下,以及输出将用于什么的情况下,我想我应该尝试一下,也许能学到一些东西。
我认为有两种方法可以解决这个问题:
1.聪明的方法:识别网格,它的颜色,方向,大小,以找到它所占据的图像区域,以便忽略它。这里有一些主要的警告需要解决。例如,页面可能没有被拍摄成平面和正方形(必须考虑到扭曲,扭曲,旋转)。还有一些我们不想删除的线条。
1.简单的方法:应用一般的图像处理,除了假设笔总是比网格暗之外,对问题知之甚少,并且输出是二进制的(黑笔/白色页)。
我更喜欢第二个,因为它更容易实现,更容易推广。
我们首先注意到页面的“白色”实际上是一种不均匀的灰色阴影(如果我们转换为灰度)。CV自适应阈值处理很好地处理了这个问题。它几乎让我们达到了目的。
下面的代码将图像分为50 x50像素块来处理光照的不均匀性。在每个块中,我们在应用阈值之前减去中值。这是一个简单的解决方案,但可能是你需要的。我还没有在很多图像上测试过它,阈值和预处理和后处理可能需要调整。如果输入图像变化很大,它将不起作用。或者如果网格相对于油墨太暗。
deikduxw2#
OpenCV有一个教程处理从图像中删除网格:
“使用形态运算提取水平和垂直线”,OpenCV文档,来源:https://docs.opencv.org/master/dd/dd7/tutorial_morph_lines_detection.html
arknldoa3#
这是一个相当困难的任务。我也有这个问题,我发现解决方案不能100%准确。顺便说一句,就在几天前我看到这个链接。也许它可以帮助。