Всё о Python

Работа с картинками в numpy

Меняем контраст и яркость

Смена контраста

def change_contrast_numpy(img: np.ndarray, factor: float) -> np.ndarray:
    # Применяем фактор к каждому пикселю
    adjusted_image = 128 + factor * (img - 128)
    
    # Обрезаем диапазон цвета от 0 до 255
    clipped_image = np.clip(adjusted_image, 0, 255)
    
    # Конвертируем в целые числа
    final_image = clipped_image.astype(np.uint8)
    
    return final_image

Смена яркости

def change_brightness_numpy(img: np.ndarray, factor: float) -> np.ndarray:
    # Умножаем каждый пиксель на фактор
    adjusted_image = img.astype(np.float32) * factor

    # Обрезаем диапазон цвета от 0 до 255
    adjusted_image = np.clip(adjusted_image, 0, 255)

    # Конвертируем в целые числа
    adjusted_image = adjusted_image.astype(np.uint8)
    
    return adjusted_image

Рекомендуемые библиотеки для работы с изображениями

  • imageio - библиотека, предоставляющая простой интерфейс для чтения и записи широкого спектра графических данных, включая анимированные изображения, объемные данные и научные форматы.
  • scipy - библиотека для работы с массивами данных и математикой, но имеет модуль ndimage, позволяющий работать с изображениями в виде матриц.
  • numpy - библиотека для работы с многомерными массивами, обычно используется в связке с imageio для работы с изображениями.
  • Pillow - высокоуровневая библиотека для работы с изображениями.
  • struct - библиотека для работы с структурными типами данных, такими как словари, множества и многомерные массивы, можно использовать для чтения BMP в бинарном режиме.

Шаблон кода для работы с изображениями

С numpy, imageio и чтением аргументов с помощью sys.argv:

import sys

from imageio.v2 import imread, imwrite

def work_with_image(im):
    ...
    return ...

# Читаем аргументы
input_filename = sys.argv[1]
output_filename = sys.argv[2]

im = imread(input_filename)

im2 = work_with_image(im)

imwrite(output_filename, im2)

Вы можете поменять название функции work_with_image, а также принимать дополнительные аргументы с помощью sys.argv.

С argparse:

import argparse

from imageio.v2 import imread, imwrite

def work_with_image(im):
    ...
    return ...

parser = argparse.ArgumentParser()
parser.add_argument("input_filename", help="Файл для обработки программой")
parser.add_argument("output_filename", help="Файл для сохранения результата")

args = parser.parse_args()

# Читаем аргументы
input_filename = args.input_filename
output_filename = args.output_filename

im = imread(input_filename)

im2 = work_with_image(im)

imwrite(output_filename, im2)