首页 > 解决方案 > 摆脱黑色垂直和水平线

问题描述

我想摆脱图像中的黑色垂直和水平线。这是我写到现在的代码

#convert RGB to grayscale
gray_slide = cv.cvtColor(slide_ds, cv.COLOR_BGR2GRAY)

#remove black areas
gray_slide[np.where(gray_slide<=[10])] = [255]

#remove edges
linek = np.zeros((11,11),dtype=np.uint8)
linek[5,...]=1
x=cv.morphologyEx(gray_slide, cv.MORPH_OPEN, linek ,iterations=1)
gray_slide+=x

但它没有做这项工作。我要这张图

前

转换成这个

后

你能帮我吗?顺便说一句,这是原始图像 原始图像

标签: pythonopencv

解决方案


修复(OpenCV 文档)是一种方法。

>>> img = cv2.imread("blacklines.jpg")
>>> mask = cv2.imread("blacklines_MASK.jpg", 0)
>>> dst = cv2.inpaint(img, mask, 4, cv2.INPAINT_TELEA) # you can fiddle with the parameters
>>> cv2.imwrite("dst.jpg", dst) # save the image

原图:

原始图像

为演示目的手工绘制的部分蒙版:

面具

最后结果:

最后

现在,如果您想以编程方式为多个图像执行此操作,您应该考虑以编程方式创建遮罩。一种方法是根据像素值过滤图像(例如,你正在用你的gray_slide.

编辑:我自己尝试摆弄一些参数,它接近了,但还没有完全实现......

>>> mask = np.zeros(gray.shape)
>>> mask[np.where(gray<=140)] = [255]
>>> cv2.imwrite('mask.jpg', mask)
True
>>> mask = cv2.imread("mask.jpg", 0)
>>> i = cv2.inpaint(img, mask, 25, cv2.INPAINT_TELEA)
>>> cv2.imwrite("i2.jpg", i)
True

新蒙版(将阈值降低到 120 似乎更好,因为它没有触及内部区域,但我保留了这个版本):

新面具

结果,这里和那里仍然有一些黑色元素:

在此处输入图像描述

最后,如果你达到了我上面展示的蒙版阶段,你只需要让这些线条“更宽”。值得一试(也许使用膨胀/侵蚀或其他东西)。


推荐阅读