交换图像目录中的 R 和 B 颜色通道值? Python

Swap R and B color channel values in a directory of images? Python

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

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

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

任何示例代码或链接将不胜感激!

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!")

您可以让 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

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

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

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

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

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