我想摆脱图像中的黑色垂直和水平线条。这是我到目前为止编写的代码
#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
但它没有做好这项工作。 我想要这张图片
转换为此
你能帮帮我吗? BTW这是原始图像 original image答案 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
原始图片:
用于演示目的的手工绘制的部分面具:
最终结果:
现在,如果您想以编程方式为多个图像执行此操作,则应考虑以编程方式创建蒙版。一种方法是根据像素值过滤图像(例如,您对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似乎更好,因为它没有触及内部区域,但我保留了此版本):
结果,这里和那里仍有一些黑色元素:
最后,如果你到达我上面所示的面具阶段,你只需要让这些线“更宽”。值得一试(也许可以使用膨胀/侵蚀等)。