Центральный фрагмент
Разбор задачи обработки изображений. N = H × W — число пикселей. Сложность включает чтение и запись изображения.
Как к ней подойти
Научитесь читать изображение как массив пикселей и проверять результат преобразования.
Изображение в OpenCV - массив пикселей, а порядок цветовых каналов при чтении обычно BGR. Операции могут менять размер, тип данных и число каналов; проверьте все три свойства перед сохранением результата.
Срез NumPy выбирает центральную область без цикла по пикселям. Верхняя граница среза не включается; операции // должны выполняться в указанном порядке.
Проверьте перед запуском
- OpenCV читает цветные изображения в порядке BGR, а Pillow — RGB.
- Сохраните результат в output.png; печать массива в консоль не заменяет изображение.
- Проверка использует фиксированные тестовые картинки, а не загруженный вами пример.
Сравните свой подход
Ниже - готовое решение, другой способ, если он есть, и важные детали проверки.
Ваше принятое решение
Рекомендуемое решение: Обработка массива без циклов Python
Срез NumPy выбирает центральную область без цикла по пикселям. Верхняя граница среза не включается; операции // должны выполняться в указанном порядке.
import cv2
import numpy as np
image = cv2.imread('input.png')
height, width = image.shape[:2]
result = image[height // 4:3 * height // 4, width // 4:3 * width // 4]
cv2.imwrite('output.png', result)
Время: O(N) при фиксированных параметрах фильтра. Память: O(N), включая исходное и результирующее изображение.
Другой способ: Выбор индексов через NumPy take
Два вызова take выбирают те же строки и столбцы. В отличие от среза создаются промежуточные массивы, поэтому срез предпочтительнее по памяти и читаемости.
import cv2
import numpy as np
image = cv2.imread('input.png')
height, width = image.shape[:2]
result = np.take(np.take(image, range(height // 4, 3 * height // 4), axis=0), range(width // 4, 3 * width // 4), axis=1)
cv2.imwrite('output.png', result)
Время: O(N). Память: O(N), включая копии массивов.