#python #numpy-ndarray
Вопрос:
Я написал код для переворачивания изображения по вертикали пиксель за пикселем. Однако код делает изображение зеркальным по линии x = высота/2.
Я попытался исправить код, установив диапазон «i» от (0, h) до (0, h//2), но результат все тот же.
Оригинальная Фотография Приведенное Фото
#import libraries
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
#read image (set image as m)
m = Image.open('lena.bmp')
#change image to array (set array as np_array)
np_array = np.array(m)
#define the width(w) and height(h) of the image
h, w = np_array.shape
#make the image upside down
for i in range(0,h):
for j in range(0,w):
np_array[i,j] = np_array[h-1-i,j]
#change array back to image (set processed image as pil_image)
pil_image = Image.fromarray(np_array)
#open the processed image
pil_image.show()
#save the processed image
pil_image.save('upsidedown.bmp')
Комментарии:
1. Ваш код отлично работает в середине изображения. Но подумайте о том, как выглядит изображение в этот момент. Верхняя половина изображения была перезаписана зеркальной нижней половиной. Поэтому, когда вы пытаетесь перезаписать нижнюю половину перезаписанной верхней половиной, вы на самом деле не меняете нижнюю. Чтобы сделать то, что вы хотите, каждая итерация выбирает пару пикселей для замены, извлекает значения во временные переменные и перезаписывает пиксели извлеченными значениями, которые были заменены. У NumPy уже есть функция
flip
для выполнения этого вдоль любой оси.
Ответ №1:
Приведенный выше код заменяет пиксели изображения на месте, поэтому результатом является зеркальное изображение. Если вы хотите перевернуть изображение пиксель за пикселем, просто создайте новый массив с той же формой, а затем замените пиксели в этом новом массиве. Например:
#import libraries
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
#read image (set image as m)
m = Image.open('A-Input-image_Q320.jpg')
#change image to array (set array as np_array)
np_array = np.array(m)
new_np_array = np.copy(np_array)
#define the width(w) and height(h) of the image
h, w = np_array.shape
#make the image upside down
for i in range(0,h):
for j in range(0,w):
new_np_array[i,j] = np_array[h-1-i,j]
#change array back to image (set processed image as pil_image)
pil_image = Image.fromarray(new_np_array)
#open the processed image
pil_image.show()
#save the processed image
pil_image.save('upsidedown.bmp')