Границы Canny
Вы решили задачу. Теперь можно сравнить подходы.
Разбор задачи обработки изображений. N = H × W — число пикселей. Сложность включает чтение и запись изображения.
Авторский разбор для локальной версии на основе условия задачи. Это не выгрузка чужих посылок и не официальное решение исходного сайта.
Ваше принятое решение
Рекомендуемое решение: Обработка массива без циклов Python
Детектор Canny работает с серым изображением. Пороги 100 и 200, апертура 3 и L2gradient=False определяют конкретный результат.
import cv2
import numpy as np
image = cv2.imread('input.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
result = cv2.Canny(gray, 100, 200, apertureSize=3, L2gradient=False)
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()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
result = cv2.Canny(gray, 100, 200, apertureSize=3, L2gradient=False)
cv2.imwrite('output.png', result)
Время: O(N). Память: O(N), включая копии массивов.
На что обратить внимание
- OpenCV читает цветные изображения в порядке BGR, а Pillow — RGB.
- Сохраните результат в output.png; печать массива в консоль не заменяет изображение.
- Проверка использует фиксированные тестовые картинки, а не загруженный вами пример.
Рекомендация учитывает сложность и читаемость для этой задачи. Единственного самого быстрого решения для всех размеров входа и всех компьютеров может не быть.