Вместо Blevels можно более эффективно использовать np.digitize.
А расчет среднего по блокам 10х10 можно сделать с помощью numpy.lib.stride_tricks.as_strided
И не будет большой разницы, как мне кажется, если не делать преобразование в hsv, затем извлекать канал яркости, а сразу считвать картинку в режиме серого.
Совет: найдите эту книгу в лучшем качестве. В этом pdf слишком низкое разрешение, да еще и бинаризация с дзитерингом. Никогда не делайте таких сканов.
Можно вытащить картинки (именно вытащить как есть, а не конвертировать), перевести в оттенки серого, сделать апсемплинг раза в 2 или более, размыть по Гауссу и бинаризировать без дзитеринга. Это лучшее, что возможно.
P.s. Djvu - растровый формат.
P.p.s. Эта книга Ахо, Компиляторы. Есть в сети в гораздо более приличном качестве в djvu и pdf. Ссылки не даю. Ищите.
res2001, все так: из одного комплексного числа получается одно комплексное число. Если у вас функция действительная, то после Фурье будет комплексный результат. Но, результат будет симметричным! Комплекно-сопряженным. И для востановления достаточно половины данных.
Elbro, если про процентиль, то посмотрите на гистограмму яркости.
На картинке белый лист занимает процентов 20 по площади и 90-я процентиль будет адекватной оценкой яркости листа. Но независимо от того, выделите ли вы лист или получите оценку его яркости, белизну оценить никак не получится. Яркость это не белизна. Белизна на фото зависит еще от освещения и от настроек камеры.
Я бы использовал детектор углов Харриса (или поиск по шаблону, уж очень четкие углы на картинке). Другой вариант: поиск линий через преобразование Хафа. А контуры тут не нужны.
Забудьте пока что про Фурье. Для начала разберитесь со сверткой. Начните с одномерной свертки. В приведенном уравнении нет яркости и цвета, это ядро свертки. Если у вас цветное изображение, то обычно фильтрация идет по каждому каналу r, g, b.
Часто ошибка бывает в том, что забывают то, что градиент имеет направление в сторону увеличения функции. А для поиска минимума нужно использовать градиент со знаком минус - антиградиент. Возможно что тут такая же ошибка.
А расчет среднего по блокам 10х10 можно сделать с помощью numpy.lib.stride_tricks.as_strided
И не будет большой разницы, как мне кажется, если не делать преобразование в hsv, затем извлекать канал яркости, а сразу считвать картинку в режиме серого.