Как я могу деинтерлейсировать изображение в Python? - PullRequest
0 голосов
/ 28 сентября 2011

Давайте предположим, что изображение хранится в виде png-файла, и мне нужно отбросить каждую нечетную строку и изменить размер результата по горизонтали до 50%, чтобы сохранить соотношение сторон.

Результат должен иметь 50% разрешения исходного изображения.

Недостаточно рекомендовать существующую библиотеку изображений, такую ​​как PIL, я хотел бы увидеть некоторый рабочий код.

ОБНОВЛЕНИЕ - Даже если вопрос получил правильный ответ, я хочу предупредить других, что PIL не в отличной форме, сайт проекта не обновлялся месяцами, нет ссылки на ошибку активность трейкера и списка довольно низкая. Я был удивлен, обнаружив, что простой файл BMP, сохраненный с помощью Paint, не был загружен PIL.

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Обязательно ли сохранять каждую четную строку (на самом деле, определить «четный» - вы считаете от 1 или 0 первой строкой изображения?)

Если вы не против, какие строки отбрасываются, используйте PIL:

from PIL import Image
img=Image.open("file.png")
size=list(img.size)
size[0] /= 2
size[1] /= 2
downsized=img.resize(size, Image.NEAREST) # NEAREST drops the lines
downsized.save("file_small.png")
0 голосов
/ 22 сентября 2017

Недавно я хотел деинтерлейсировать некоторые стереоизображения, извлекая изображения для левого и правого глаза.Для этого я написал:

from PIL import Image

def deinterlace_file(input_file, output_format_str, row_names=('Left', 'Right')):
    print("Deinterlacing {}".format(input_file))
    source = Image.open(input_file)
    source.load()
    dim = source.size

    scaled_size1 = (math.floor(dim[0]), math.floor(dim[1]/2) + 1)
    scaled_size2 = (math.floor(dim[0]/2), math.floor(dim[1]/2) + 1)

    top = Image.new(source.mode, scaled_size1)
    top_pixels = top.load()
    other = Image.new(source.mode, scaled_size1)
    other_pixels = other.load()
    for row in range(dim[1]):
        for col in range(dim[0]):
            pixel = source.getpixel((col, row))
            row_int = math.floor(row / 2)
            if row % 2:
                top_pixels[col, row_int] = pixel
            else:
                other_pixels[col, row_int] = pixel


    top_final = top.resize(scaled_size2, Image.NEAREST) # Downsize to maintain aspect ratio
    other_final = other.resize(scaled_size2, Image.NEAREST) # Downsize to maintain aspect ratio
    top_final.save(output_format_str.format(row_names[0]))
    other_final.save(output_format_str.format(row_names[1]))

output_format_str должен выглядеть примерно так: "filename-{}.png" где {} будет заменено на имя строки.

Обратите внимание, что это заканчивается изображениембудучи половиной его первоначального размера.Если вы не хотите этого, вы можете изменить последний шаг масштабирования

Это не самая быстрая операция, поскольку она проходит пиксель за пикселем, но я не мог найти простой способ извлечения строк из изображения.

...