Python 去除黑色垂直线和水平线

Python 去除黑色垂直线和水平线,python,opencv,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,...]

我想去掉图像中的黑色垂直线和水平线。这是我到现在为止写的代码

#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
#将RGB转换为灰度
灰色\u幻灯片=cv.CVT颜色(幻灯片\u ds,cv.COLOR\u BGR2GRAY)
#清除黑色区域
灰色幻灯片[np.其中(灰色幻灯片修复()是一种方法

>>> 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
原始图像:

出于演示目的手工绘制的部分遮罩:

最终结果:

现在,如果你想对多个图像编程,你应该考虑用编程方式创建掩码。 编辑:我自己尝试过摆弄一些参数,结果很接近,但还没有完全达到

>>> 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
>掩码=np.零(灰色.形状)
>>>掩码[np.where(灰色>>cv2.imwrite('mask.jpg',mask)
真的
>>>mask=cv2.imread(“mask.jpg”,0)
>>>i=cv2.修补(img,面罩,25,cv2.修补)
>>>cv2.imwrite(“i2.jpg”,i)
真的
新的遮罩(将阈值降至120似乎更好,因为它没有触及内部区域,但我保留了此版本):

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

最后,如果你达到了我上面提到的蒙版阶段,你只需要把这些线条“加宽”就行了。这是值得一试的(可能使用膨胀/腐蚀之类的方法)。

修复()就是一种方法

>>> 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
原始图像:

出于演示目的手工绘制的部分遮罩:

最终结果:

现在,如果你想对多个图像编程,你应该考虑用编程方式创建掩码。 编辑:我自己尝试过摆弄一些参数,结果很接近,但还没有完全达到

>>> 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
>掩码=np.零(灰色.形状)
>>>掩码[np.where(灰色>>cv2.imwrite('mask.jpg',mask)
真的
>>>mask=cv2.imread(“mask.jpg”,0)
>>>i=cv2.修补(img,面罩,25,cv2.修补)
>>>cv2.imwrite(“i2.jpg”,i)
真的
新的遮罩(将阈值降至120似乎更好,因为它没有触及内部区域,但我保留了此版本):

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


最后,如果你达到了我上面展示的遮罩阶段,你只需要把这些线条“加宽”就行了。这是值得一试的(可能使用扩张/侵蚀之类的方法).

您可以尝试以下方法:为所有非纯白色的对象创建一个遮罩。腐蚀此遮罩。将每个未遮罩的像素设置为纯白色。非常感谢。是否有方法使用垂直和水平边缘检测,然后消除检测到的区域?请尝试lineSegmentDetector。但可能任何基于边缘的解决方案都很难使用参数化,因为水滴也有一个类似边缘的边框。是的,这也会检测水滴边缘…您可以访问原始图像而不使用jpeg压缩吗?您可以访问在原始图像中创建黑色遮罩的过程吗?处理原始图像看起来更容易(即使使用jpeg伪影,也可能使用插值边框)您可以尝试以下操作:为所有非纯白色的对象创建一个遮罩。腐蚀此遮罩。将每个未遮罩的像素设置为纯白色。非常感谢。是否有方法使用垂直和水平边缘检测,然后消除检测到的区域?请尝试lineSegmentDetector。但可能有任何基于边缘的解决方案ion将很难参数化,因为水滴也有类似边缘的边界。是的,这也会检测水滴的边缘…您是否可以访问原始图像而不使用jpeg压缩?您是否可以访问在原始图像中创建黑色遮罩的过程?处理原始图像看起来更容易(即使使用jpeg伪影,也可能使用插值边框)比输入图像上的效果更好。谢谢。是的,因为有1000多个图像,所以必须通过编程来完成。我使用以下命令过滤图像:gray_slide[np.where(灰色_slide@MaryamS我还添加了一些东西。我认为它非常接近,如果你进行实验,你会成功的。祝你好运!谢谢。是的,因为有1000多张图像,所以必须通过编程来完成。我用以下命令过滤图像:gray\u slide[np.where(灰色_slide@MaryamS我还添加了一些东西。我认为这很接近,如果你进行实验,你会成功的。祝你好运!