【问题标题】:Turn black pixel on the first image to white if it is also black on a second co-located image如果第二个共存图像上的黑色像素也是黑色,则将第一张图像上的黑色像素变为白色
【发布时间】:2016-09-19 20:49:54
【问题描述】:

我有 2 个位于同一位置的图像,它们都以类似的方式创建,并且都具有 7,221 x 119 像素的大小。

我想写一个这样的逻辑:

如果图像 1 中某个像素(称为 x)的 R,G,B 值 = 0,0,0(黑色)并且图像 2 中像素 x 的 R,G,B 值 = 0,0 ,0(黑色)然后将图像 1 中像素 x 的 R,G,B 值更改为 255,255,255(白色),否则不变。

如何在 Matlab 或 Python 中做到这一点?

【问题讨论】:

  • 如果图像是 png 格式,pypng 应该提供您需要的所有功能。
  • 只有一个像素?
  • 到底是什么问题?使用一个好的界面,它给你像素(例如使用 scikit-image)让这变得微不足道!别的东西:jpg 是这个任务可以想象的最糟糕的输入格式。您可能需要重新制定逻辑/比较以使其更加健壮。由于这些是有损压缩的,因此颜色会发生变化(未保存为 RGB)。这(也许)使您的逻辑错误。 (例如:由您设计的图片 A 和 B;压缩为 jpg;执行您的操作,您会看到一些像素未被识别(均为 0),尽管事实上它们应该被识别;由于 jpg 压缩导致的信息丢失)

标签: image rgb


【解决方案1】:

您应该能够在 python 中使用 Pillow 包来执行此操作。您需要加载两个像素,检查所有颜色通道是否为0,如果是,则将它们设置为255,然后再次保存图像。在 Python 中,0 被解释为False,所以当vals 只包含零时,not any(vals) 将是True

from PIL import Image

im1 = Image.open("image1.jpg")
im2 = Image.open("image2.jpg")

pixel = (0, 0)
newcolor = (255,)*3
if not any(im1.getpixel(pixel)) and not any(im2.getpixel(pixel)):
    im1.putpixel(pixel, newcolor)
im1.save('image1conv.jpg')

注意not any(im1.getpixel(pixel)) and not any(im2.getpixel(pixel))可以改写为not any(im1.getpixel(pixel) + im2.getpixel(pixel)),但我认为第一种方式逻辑更清晰。

【讨论】:

  • 谢谢。代码确实可以运行,但是当我保存新图像时,它看起来与旧图像相似?我很确定 2 张图片上的某些部分有黑色像素。
  • @AnhNguyen:正如 sascha 解释的那样,jpg 格式不适合这项任务。由于其压缩的工作原理,它通常不能忠实地保留准确的颜色。因此,“黑色”区域可能不是完全黑色的,如果它们完全是黑色的话,那么得到的白色可能不会是纯白色。此外,我提供的算法旨在处理单个像素,这就是您提出的问题。有更有效的方法来处理大量像素。
  • 是的,对不起,我才想通。我不只是想要1个像素。我需要遍历图像(7,221 x 119 像素),找到所有黑色像素,如果图像 2 中的相同像素也是黑色,则将它们变成白色。
  • @AnhNguyen 您是否阅读并理解了我上面关于 jpg 的评论?你可以引入你需要的循环(修改 TheBlackCat 的代码)来处理所有像素,可能只有 3 行。但是想想问题!将图像转换为灰度,引入阈值(意思是
  • 对不起,我一次只能处理 1 条评论,而且我不是编码员,所以我不会 24 小时在线。感谢您的建议。我有点理解你刚才所说的,但我不熟悉如何在 python 上做到这一点。您是否建议使用 Matlab 图像工具箱中的阈值?
猜你喜欢
  • 2015-05-05
  • 2019-12-13
  • 2018-09-28
  • 2023-01-13
  • 2017-07-19
  • 2015-02-04
  • 2015-02-13
  • 2019-07-25
  • 1970-01-01
相关资源
最近更新 更多