合并图像为全黑



当我运行此函数时,它会将图像拆分为红/绿/蓝三个文件。这些图像看起来还可以。但是,合并逻辑会产生一个完全黑色的结果。

def split_image_into_bands(filename):
img = Image.open(filename)
data = img.getdata()
red = [(d[0], 0, 0) for d in data]
green = [(0, d[1], 0) for d in data]
blue = [(0, 0, d[2]) for d in data]

img.putdata(red)    # This overwrites whatever was in the image
img.save(os.path.splitext(filename)[0] + "_red.jpg")
img.putdata(green)
img.save(os.path.splitext(filename)[0] + "_green.jpg")
img.putdata(blue)
img.save(os.path.splitext(filename)[0] + "_blue.jpg")
# Put the 3 images back together to show that it works
rimage = Image.new("L", img.size)
rimage.putdata(red)
gimage = Image.new("L", img.size)
gimage.putdata(green)
bimage = Image.new("L", img.size)
bimage.putdata(blue)
img = Image.merge(img.mode, (rimage, gimage, bimage))
img.save(os.path.splitext(filename)[0] + "_merged.jpg")

PIL可能对您的阵列是RGB阵列感到困惑,因为它需要单通道(灰度(阵列。

这可以很好地工作(并且由于使用zip来转置数据数组而更快(。

def split_image_into_bands(filename):
basename = os.path.splitext(filename)[0]
img = Image.open(filename)
red, green, blue = zip(*img.getdata())  # each channel as a single-channel array
rimage = Image.new("L", img.size)
rimage.putdata(red)
gimage = Image.new("L", img.size)
gimage.putdata(green)
bimage = Image.new("L", img.size)
bimage.putdata(blue)
img = Image.merge(img.mode, (rimage, gimage, bimage))
img.save(basename + "_merged.jpg")

不如使用opencv来处理图像,与PIL相比速度相当快,你可能想尝试以下代码,

import os
import cv2
def split_image_into_bands(filename):
img = cv2.imread(filename)
b, g, r = cv2.split(img)  # For BGR image
# save the channels RGB
cv2.imwrite(os.path.splitext(filename)[0] + "_red.jpg", r)
cv2.imwrite(os.path.splitext(filename)[0] + "_green.jpg", g)
cv2.imwrite(os.path.splitext(filename)[0] + "_blue.jpg", b)
# merge the channels
img_merged = cv2.merge((b, g, r))
cv2.imwrite(os.path.splitext(filename)[0] + "_merged.jpg", img_merged)

最新更新