python - 摆脱黑色垂直和水平线
问题描述
我想摆脱图像中的黑色垂直和水平线。这是我写到现在的代码
#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
但它没有做这项工作。我要这张图
转换成这个
你能帮我吗?顺便说一句,这是原始图像 原始图像
解决方案
修复(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 似乎更好,因为它没有触及内部区域,但我保留了这个版本):
结果,这里和那里仍然有一些黑色元素:
最后,如果你达到了我上面展示的蒙版阶段,你只需要让这些线条“更宽”。值得一试(也许使用膨胀/侵蚀或其他东西)。