Pull to refresh

Comments 19

Долго думал что вы хотели этим сказать:
Низкое качество свзано с использованием Matplotlib, за то там видны размеры по
осям.

Так и не понял.
Говоря о качестве вы имеете в виду «ступеньки», которые неизбежно появились при чересстрочном разрезании изображения?
При таком «ресайзе» произошла потеря 3/4 растровой информации. Для качественного уменьшения размеров следовало бы каждый пиксель результирующего изображения вычислять усреднением четырёх соответствующих пикселей исходной картинки.
Для этого, кстати, можно было попиксельно сложить и поделить на 4 все четыре получившихся среза.

Я имел ввиду качество изображения после его визуализации в matplotlib по сравнению с качеством из сохраненного файла. Сравните со следующей картинкой в статье.

Спасибо большое! Я знаю, что такое интерполяция :) Это был учебный пример для демонстрации работы reshape.

Я не сомневаюсь, что вы знаете про интерполяцию, но претензия была к качеству отображения в mpl. Так они по умолчанию показывают в nearest, и картинка в зависимости от масштабирования и размера фигуры может выглядеть плохо.


Можно передать в imshow другой метод интерполяции, и картинка будет выглядеть лучше.

Кстати, существуют языки программирования изначально ориентированные на обработку массивов, например APL или J. Они еще и очень лаконичные, большинство ваших примеров можно записать в одну-две коротенькие строчки.

Если интересно вот есть простой туториал по J.
Чтобы конвертировать изображение из BGR в RGB:

cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

В моем примере меньше букв используется для той же операции :) На самом деле, не хотелось перегружать статью про numpy методами из других библиотек.

Спорный момент — вы предлагаете использовать OpenCV для того, чтобы прочитать файл, но операции с изображениями — «голый» numpy.
Я бы рекоммендовал для таких операций использовать OpenCV (тем более, что зависимость и так используется), т.к. та же функция cvtColor может быть использована для конвертации в черно-белый, либо другой формат.
То же самое касается поворотов — это отличное совпадение, что изображение поворачивается на 90 градусов, но в общем случае куда проще использовать warpAffine.
Это не умаляет достоинств numpy, просто для обработки изображений лучше использовать OpenCV.

Я с вами согласен в части использования OpenCV для обработки изображений, но сомневаюсь в его применимости для демонстрации возможностей NumPy :)

OpenCV вообще не нужно использовать для чтения изображений, чтобы потом работать с ними как numpy-массивами. Есть Pillow, прекрасная imageio или scikit-image. И никаких странных BGR. :)

Очень хорошо систематизировали!
Большое спасибо
А по какой причине «отцы» NumPy решили сделать первой координатой столбцы, а строки — второй?
Интеграция алгоритмов, на нем написанных, с библиотеками и фреймворками использующими «нормальную» ориентацию — выливается у нас в постоянную боль и жестокие баги…

Если рассматривать двумерный массив, то ось с индексом 0 — это как раз строки, 1 — столбцы. Такая индексация естественна для работы с матрицами и массивами, применяется в большинстве библиотек для работы с массивами/матрицами/линейной алгеброй, например, Boost.MultiArray или Eigen в C++. Поэтому не совсем понятно какую именно боль у вас это вызывает.


>>> a = np.arange(3*4).reshape(3, 4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

>>> a.shape
(3, 4)  # 3 строки, 4 столбца

>>> a[1, 2] # a[row_index, col_index]
6

numpy также поддерживает различный порядок размещения данных в памяти column-major и row-major По умолчанию используется column-major как в фортране.

Болезненные ощущения могут возникать, например, при работе с OpenCV. Там координаты задаются в порядке ху. И если в работе с изображением применять NumPy и OpenCV вместе, то это как иметь в семье 2 машины: с автоматом и механикой :) Сначала тяжело, но потом привыкаешь легко перескакивать между концепциями.

Извините, выпало «при работе с изображениями». Очень трудно привыкнуть к двум разным нотациям (y,x) и (х,y) в зависимости от того, к какому пакету относится обьект.
Sign up to leave a comment.

Articles