Python - 删除源自图像边界的黑色像素

Posted

技术标签:

【中文标题】Python - 删除源自图像边界的黑色像素【英文标题】:Python - Remove Black Pixels originatin from the border of an image 【发布时间】:2021-01-25 13:10:06 【问题描述】:

我对图像处理非常陌生,我正在尝试清理类似于图片 1 的来自图像边界的黑色像素的图片。

图像是 PDF 中的剪辑字符,我尝试使用 tesseract 处理以检索字符。我已经在 *** 中搜索了答案,但只找到了摆脱黑色边框的解决方案。 我需要用白色像素覆盖角落中的所有黑色像素,以便 tesseract 可以正确识别字符。

我无法更改用于剪切字符的边界框,因为字符位于边界框的不同区域的中心,如果我剪切边界框,我会剪切一些字符,如下所示

我的第一个猜测是递归地追踪具有一定黑色阈值的像素,但我害怕在这种情况下计算时间并且真的不知道从哪里开始以及如何开始,除了使用两个两个维数组,一个是像素,一个是指示我是否已经处理过该像素。

我们将不胜感激。

编辑:更多案例图片,需要清除边缘的黑色像素:

编辑:创建边框图像的代码片段:

    @staticmethod
    def __get_border_image(image: Image) -> Image:
        data = numpy.asarray(image)

        border = cv2.copyMakeBorder(data, top=5, bottom=5, left=5, right=5, borderType=cv2.BORDER_CONSTANT)

        return Image.fromarray(border)

【问题讨论】:

您能否提供更多图像示例和所需内容。第一张图片不清楚。 我添加了一些图片。如果需要,我也可以澄清一下! 【参考方案1】:

试试这样:

人为地在边缘周围添加一个 1px 宽的黑色 border flood-fill 从左上角开始,白色全黑像素 从第一步中移除 1px 边框(如有必要)

添加边框的目的是让白色在图像的所有边缘“流动”并到达任何接触边缘的黑色项目。

【讨论】:

有没有办法在 Python 中从字节或 PIL.Image 打开 opencv 图像,因为我没有存储在文件中的图像? 请记住,OpenCV 将图像存储为 Numpy 数组。所以,我想你的意思是frame = np.frombuffer(data, dtype=np.uint8).reshape((height, width, 3)) 或者3 变成1 如果灰度。 我以前从未使用过 OpenCv。我根据文档看到了这一点,但我无法将所有图像存储为文件,我将它们作为 PIL.Image 存储,如果我需要将所有剪辑的图像存储为文件,那么我的表现真的很糟糕而且我买不起 不确定问题出在哪里 - 如果您展示了 *** 所需的代码,帮助您会更容易。您可以在PIL 中使用ImageOps.expand(),参见此处***.com/a/60392932/2836621,您可以在PIL 中使用ImageDraw.floodfill(),参见***.com/a/65683106/2836621 我现在开始创建边框了。代码片段被编辑到帖子中。我之前没有要显示的代码,因为我只有 PIL.Image 类,没有别的。

以上是关于Python - 删除源自图像边界的黑色像素的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenCV python 中将白色像素转换为黑色

如何使用python从图像中去除边界边缘噪声?

使用python提取二进制图像中的连接像素

opencv如何读取多边形区域内的像素值?

图像细化函数(背景为黑色像素值为0,前景为白色像素值255,必须只含有0和255的像素值,即二值化后的图像)

用python中的Pillow替换动态图像中的同一行像素