Объединенное изображение полностью черное - PullRequest
0 голосов
/ 24 февраля 2020

Когда я запускаю эту функцию, она разбивает изображение на три файла: красный / зеленый / синий. Эти изображения выглядят хорошо. Однако логика слияния c создает полностью черный результат.

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

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Как насчет того, чтобы использовать 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)
0 голосов
/ 24 февраля 2020

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