【问题标题】:Swap R and B color channel values in a directory of images? Python在图像目录中交换 R 和 B 颜色通道值? Python
【发布时间】:2015-07-02 22:22:04
【问题描述】:

我有一个很大的屏幕截图目录。愚蠢的我,我没有检查它们是否正常,并发现 VLC 存在 FRAPS True RGB 的错误。幸运的是它似乎可以修复,唯一的问题是 R 和 B 通道被交换了。

使用 python 的 PIL,我想获取每个图像的每个像素的红色和蓝色值,然后交换它们重新插入。

我知道如何遍历目录,所以我缺少的主要部分是交换值的最佳方式。我想我可以逐个像素地完成它,但也许有一种更 Pythonic 的方式,也许在一个命令中批量处理?

任何示例代码或链接都将受到高度赞赏!

【问题讨论】:

    标签: python colors python-imaging-library image-manipulation


    【解决方案1】:

    基于@veta 的回答,通过处理颜色通道而不是单个像素可以大大加快该过程:

    在每个文件的循环中,通道可以这样交换:

    r, g, b = im_rgb.split()
    im_rgb = Image.merge('RGB', (b, g, r))
    

    只需使用这两行而不是 veta 答案中的嵌套循环。这应该运行得更快。

    此解决方案首先使用Image.split() 创建三个单独的图像,每个图像用于 R、G、B、通道。然后Image.merge() 用于创建一个新的 R 和 B 通道交换的 RGB 图像。

    【讨论】:

      【解决方案2】:

      您可以让 ImageMagick 为您完成这项工作。让我们制作一个这样的红黑渐变图像:

      convert -size 256x100 gradient:red-black in.png
      

      现在我们可以加载它,分离 R、G 和 B 通道,交换红色和蓝色并将它们重新组合到输出图像中:

      convert in.png -separate -swap 0,2 -combine out.png
      

      ImageMagick 已安装在大多数 Linux 发行版上,可用于 OSX(最好通过homebrew),也可用于here 的 Windows。

      例如,如果你想做一个包含PNG 文件的整个目录,你会这样做

      find . -iname "*.png" -exec convert "{}" -separate -swap 0,2 -combine {} \;
      

      如果您使用的是 Linux 或 OS X。

      如果您使用的是 Windows,则需要使用疯狂的 Windows 语法执行以下操作:

      FOR %%F in (*.PNG) DO convert "%%F" -separate -swap 0,2 -combine "%%F
      

      【讨论】:

      • 哦,这很漂亮,我最终让 python 来做这件事,但我想了解更多关于这个的信息。例如,我如何将它用于整个目录?我可以使用目录作为 infile 并添加 -r 标志吗?
      • 请再看看 - 我已经更新了我的答案。
      • 请注意,ImageMagick 也有 Python 绑定,请参阅:imagemagick.org/script/api.php
      • 嗨@AdamParkin,感谢您指出这一点 - 我没有提到 Python 绑定是相当失职。
      【解决方案3】:
      import os
      from PIL import Image
      
      
      dirPath = r"D:\Fraps\Movies\Screens"
      dirList = os.listdir(dirPath)
      outPath = r"D:\Fraps\Movies\Screens\Output"
      
      for (dirname, dirs, files) in os.walk(dirPath):
         for filename in files:
             if filename.endswith('.png'):
                  print("Opening:"+filename)
                  thefile = os.path.join(dirname,filename)
                  im = Image.open(thefile)
                  #im.load()
      
                  width, height = im.size
      
                  im_rgb = im.convert('RGB')
      
                  for x in range(0, width):
                      for y in range(0,height):
                          r, g, b = im_rgb.getpixel((x, y))
                          im_rgb.putpixel((x, y), (b, g, r))
      
                  print("Saving:"+filename)
                  #outfile, ext = os.path.splitext(infile)
                  outfile = os.path.join(outPath,filename)
                  im_rgb.save(outfile, "PNG")
      
      
      print("Ding!")
      

      【讨论】:

        猜你喜欢
        • 2014-12-05
        • 1970-01-01
        • 2015-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-15
        • 2023-03-19
        • 1970-01-01
        相关资源
        最近更新 更多