Преобразуйте изображение в массив numpy, переверните массив, затем превратите в изображение

#python #arrays #numpy #python-imaging-library

Вопрос:

Я пытаюсь выполнить некоторую работу на python для класса и не могу перевернуть свое изображение.

 import matplotlib.pyplot as plt
import numpy as np
import requests
from io import BytesIO

response = requests.get('https://www.boredpanda.com/blog/wp-content/uploads/2014/08/cat-looking-at-you-black-and-white-photography-1.jpg')
im = Image.open(BytesIO(response.content))

px = im.load()
pix_val_flat = []
for x in range(0, im.width):
    for y in range(0, im.height):
        pix_val_flat.append(px[x, y])
print(pix_val_flat)

arr = np.array(pix_val_flat)
reversed_array = arr[::-1]

#def displayImage(pix_val_flat):
#    plt.imshow(pix_val_flat)
im.show(reversed_array)
 

Есть ли лучший способ сделать это?

Комментарии:

1. Почему бы не использовать встроенную функцию флипа numpy ?

Ответ №1:

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

Например, используя подушку, вы могли бы сделать :

 from PIL import Image

import numpy as np
import matplotlib.pyplot as plt 

with Image.open("whatever_image.jpg") as im:

    im = im.transpose(method=Image.FLIP_LEFT_RIGHT)
    plt.imshow( np.asarray(im) )
 

После внесения всех изменений , которые вы хотите внести в свой массив/изображение (обе матрицы значений в оперативной памяти), вы можете легко сохранить его в виде файла классического формата изображения с :

 im1.save("whatever_image_modified.jpg")
 

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

Чтобы назвать несколько :

  • Scikit-изображение.
  • OpenCV.
  • Махоты.
  • Проще простого.
  • СциПи.
  • Подушка.
  • Матплотлиб.

Источник

Ответ №2:

Для этого вам не обязательно нужна какая-либо специальная функция, это возможно только с помощью индексации:

 import numpy as np
import matplotlib.pyplot as plt

img = plt.imread("cat.jpg")
flipped_lr = img[:, ::-1, :]
flipped_ud = img[::-1, :, :]