изменение размера изображения с определенной формой - PullRequest
1 голос
/ 04 февраля 2020

Я хотел бы изменить размер изображения, и это массив numpy. размер этой картинки (480, 640, 3), и я хотел бы сделать это (55, 74, 3).

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

, но в моем случае я хотел бы сделать что-то еще, что я хочу взять первый пиксель первого столбца, а затем отбросить второй pixel, возьмите третий пиксель третьего столбца, затем отбросьте четвертый пиксель и так далее. за ряды зачистки второго, четвертого, шестого, ..... аут. форма должна выглядеть следующим образом: https://imgur.com/2jPRYiy только с коричневыми пикселями.

как я могу реализовать то, что показано на картинке? есть ли какая-то функция или библиотека для этого? спасибо

1 Ответ

1 голос
/ 05 февраля 2020

Вы можете сделать это с помощью Numpy, то есть для всех библиотек Python ( OpenCV , PIL / Pillow , scikit-image , Wand , vips ) используйте снизу.

Итак, предположим, что мы создаем фиктивное изображение, подобное этому:

import numpy as np

# Synthetically create big image
big = np.arange(48, dtype=np.uint8).reshape((6,8))                                                                                                    

Это будет выглядеть так :

array([[ 0,  1,  2,  3,  4,  5,  6,  7],
       [ 8,  9, 10, 11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29, 30, 31],
       [32, 33, 34, 35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44, 45, 46, 47]], dtype=uint8)

Если вам требуется каждая вторая строка и каждый второй столбец, используйте:

subsampled = big[0::2, 0::2]

, и вы получите это в своем subsampled изображении:

array([[ 0,  2,  4,  6],
       [16, 18, 20, 22],
       [32, 34, 36, 38]], dtype=uint8)

Если вы хотите повторно применить его, сделайте то же самое снова:

subsampledx2 = subsampled[0::2, 0::2]

, и вы получите это:

array([[ 0,  4],
       [32, 36]], dtype=uint8)

Я не уверен, как вы надеясь, что взятие каждой второй строки и каждого второго столбца уменьшит изображение размером 640x480 до 74x55, может быть, вы планируете применять его рекурсивно?


Извините, если у вас есть цветное изображение с 3 каналами RGB, вы можно использовать дополнительное двоеточие, чтобы явно получить все 3 канала RGB:

subsampled = big[0::2, 0::2, :]
...