【问题标题】:Why does converting two images to black and white produce two different results?为什么将两张图像转换为黑白会产生两种不同的结果?
【发布时间】:2019-07-20 18:27:27
【问题描述】:

我正在尝试做一个关于机器学习的小项目,在此过程中,我必须将一些图像转换为黑白图像以对图像进行分类。我的问题是,相同的方法使用相同的算法会产生截然不同的结果。 这是转换前的图像Image 1this 是转换后的样子。是的,看起来不错。

这是我使用的代码。

test_img=Image.open(str(idx) + '.png')
test_img=test_img.resize((100,100),Image.ANTIALIAS)
test_img.show()
test_img=test_img.convert('1')

现在我将对产生this 结果的image 做同样的事情。如您所见,它已被转换,我在图像上到处都是奇怪的黑点。 这是我使用的代码:

source_img=source_img.resize((100,100),Image.ANTIALIAS)
source_img=source_img.convert('1')
source_img.show() 

我尝试了多种方法将图像转换为黑白,包括source_img.convert('L') 方法和其他方法,我无法将图像展平为一维数组。

有谁知道为什么转换对第一张图像有效,而对第二张无效?

【问题讨论】:

  • 如果您不使用 OpenCV,为什么您的问题会被标记?
  • 你确定 bw/1bit 吗?大多数 ML 算法都在灰度上工作,例如8位深度。亚历山大的回答可能表明了推理:很难用 1 位保留大量原始信息。

标签: python image-processing computer-vision


【解决方案1】:

PIL 方法convert("1") 使用抖动转换为黑白,如the docs state

将灰度(“L”)或“RGB”图像转换为双电平(模式“1”)图像的默认方法使用 Floyd-Steinberg 抖动来近似原始图像亮度级别。

抖动通过在图像中放置噪点来近似多种颜色,从而以更少的颜色复制多种颜色。查看Wikipedia article for dithering 了解更多信息。例如,从那个页面开始,下面的图像是抖动的——只有黑白像素,但抖动使它看起来有点灰度。这就是为什么你的第二张图像有一些点画——颜色不是很白,所以它试图用一些黑色来近似灰色。在那里不是特别令人信服,尽管它在其他类型的图像上更令人印象深刻:

如果要对图像进行二值化,最简单的方法是设置一个阈值,使高于该阈值的每个像素都被视为白色,低于该阈值的所有像素都被视为黑色。作为convert() 状态的文档:

如果抖动为 NONE,则所有非零值都设置为 255(白色)。要使用其他阈值,请使用point() 方法。

您可以找到here 的文档。如果您想使用 OpenCV,您可以通过cv2.threshold()、文档here、教程here 以及我之前给出的相关堆栈溢出答案here 来完成此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2019-10-04
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多