交换图像目录中的 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 通道。
我有一个很大的屏幕截图目录。愚蠢的我,我没有检查它们是否正常,发现 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 通道。