Разделите изображение 512 * 256 на 2 изображения, каждое по 256 * 256, используя PIL - PullRequest
1 голос
/ 13 июня 2019

У меня есть изображение с размерами 512 * 256, например,

enter image description here

Левая часть должна быть входом для NN, а правая часть имеетбыть соответствующим выходом.Следовательно, каждое из изображений имеет размеры 256 * 256.

То, что я до сих пор делал, чтобы разделить оба изображения:

image_dir = 'images'
image_filenames = os.listdir( image_dir )
for filename in image_filenames:
    image = Image \
        .open(os.path.join( image_dir, filename)) \
        .convert( 'RGB' )
    width , height = image.size
    x.append( np.asarray( image.crop( ( width , width/2 , width , width/2 )) ))
print( x )

На выходе показано изображение, которое является пустым иразмером 0 * 0,

[array(<PIL.Image.Image image mode=RGB size=0x0 at 0x27049C55CF8>,
      dtype=object), array(<PIL.Image.Image image mode=RGB size=0x0 at 0x27049C55710>,
      dtype=object)]

Как я могу идеально разделить изображение 512 * 256 на 2 изображения 256 * 256 без проблем выше , используя PIL или даже NumPy ?

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Поскольку вы подразумеваете, что вас не беспокоит, использует ли решение PIL или нет, здесь есть просто использование ImageMagick в командной строке ... не нужно писать любой код:

magick image.jpg -crop 50x100% sub-%d.jpg

Это дает вам две половины:

sub-0.jpg
sub-1.jpg

ImageMagick включен в большинство дистрибутивов Linux и доступен для macOS и Windows. Если вы используете версию 6 или старше, замените magick на convert.


Если у вас есть много дел, вы можете использовать GNU Parallel , чтобы сделать их все параллельно, как это:

parallel 'magick {} -crop 50x100% {.}-sub-%d.jpg' ::: *.jpg

Итак, если вы начали с fred.jpg и bill.jpg, вы получили бы это:

-rw-r--r--   1 mark  staff      13924 13 Jun 16:52 fred-sub-0.jpg
-rw-r--r--   1 mark  staff      11650 13 Jun 16:52 fred-sub-1.jpg
-rw-r--r--   1 mark  staff      13924 13 Jun 16:52 bill-sub-0.jpg
-rw-r--r--   1 mark  staff      11650 13 Jun 16:52 bill-sub-1.jpg
1 голос
/ 13 июня 2019

Если я что-то упустил, и если вы хотите использовать numpy, это должно быть просто:

import numpy as np

# Create example image
A = np.random.random((512, 256, 3))

# Split the image into two images
A1 = A[:256]
A2 = A[256:]

print(A.shape)
print(A1.shape)
print(A2.shape)

Это просто разбивается на первое измерение.

Более общее решение будет:

import numpy as np

A = np.random.random((512, 256, 3))

A1 = A[:A.shape[0]//2]
A2 = A[A.shape[0]//2:]

print(A.shape)
print(A1.shape)
print(A2.shape)

В этом случае //2 для целочисленного деления. Тогда если A = np.random.random((512, 256, 3) результат будет:

(512, 256, 3)
(256, 256, 3)
(256, 256, 3)

А если A = np.random.random((513, 256, 3), то результат будет:

(513, 256, 3)
(256, 256, 3)
(257, 256, 3)

В случае нечетного числа для первого измерения вам нужно будет принять решение относительно разницы в размере изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...