Мини-урок · перед практикой

Оттенки серого

Разбор задачи обработки изображений. N = H × W — число пикселей. Сложность включает чтение и запись изображения.

Как к ней подойти

Научитесь читать изображение как массив пикселей и проверять результат преобразования.

Коротко о теме

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

Ключевая идея · Обработка массива без циклов Python

cv2.cvtColor переводит BGR в яркость с теми же коэффициентами и округлением, что используются в проверке. Простое среднее трёх каналов даёт другой результат.

Проверьте перед запуском

  • OpenCV читает цветные изображения в порядке BGR, а Pillow — RGB.
  • Сохраните результат в output.png; печать массива в консоль не заменяет изображение.
  • Проверка использует фиксированные тестовые картинки, а не загруженный вами пример.

Сравните свой подход

Ниже - готовое решение, другой способ, если он есть, и важные детали проверки.

Ваше принятое решение

Рекомендуемое решение: Обработка массива без циклов Python

cv2.cvtColor переводит BGR в яркость с теми же коэффициентами и округлением, что используются в проверке. Простое среднее трёх каналов даёт другой результат.

import cv2
import numpy as np

image = cv2.imread('input.png')
result = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imwrite('output.png', result)

Время: O(N) при фиксированных параметрах фильтра. Память: O(N), включая исходное и результирующее изображение.

Другой способ: Загрузка через Pillow, обработка через OpenCV

Альтернативный путь ввода: Pillow читает RGB, затем каналы переставляются в BGR для OpenCV. Алгоритм обработки тот же, но при загрузке возникает дополнительная копия изображения. Это полезно при работе с форматами и метаданными Pillow.

import cv2
import numpy as np

from PIL import Image
image = np.array(Image.open('input.png').convert('RGB'))[:, :, ::-1].copy()
result = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imwrite('output.png', result)

Время: O(N). Память: O(N), включая копии массивов.