摆脱黑色的垂直和水平线条

时间:2018-06-03 10:12:57

标签: python opencv

我想摆脱图像中的黑色垂直和水平线条。这是我到目前为止编写的代码

#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

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

before

转换为此

after

你能帮帮我吗? BTW这是原始图像 original image

1 个答案:

答案 0 :(得分:2)

修复(OpenCV docs)是实现此目的的一种方法。

>>> 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

原始图片:

Original image

用于演示目的的手工绘制的部分面具:

Mask

最终结果:

Final

现在,如果您想以编程方式为多个图像执行此操作,则应考虑以编程方式创建蒙版。一种方法是根据像素值过滤图像(例如,您对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似乎更好,因为它没有触及内部区域,但我保留了此版本):

newmask

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

enter image description here

最后,如果你到达我上面所示的面具阶段,你只需要让这些线“更宽”。值得一试(也许可以使用膨胀/侵蚀等)。