не могу правильно преобразовать массив в изображение - PullRequest
1 голос
/ 11 апреля 2019

Я хочу прочитать изображение из файла, изменить его размер до квадратного размера (изменить размер), а затем преобразовать массив в изображение для показа.Поэтому я пишу код ниже для этого, но, к сожалению, метод fromarray не показывает истинное изображение в конце концов .. как я могу это исправить?(я не хочу использовать opencv или другую встроенную функцию)

#import the libraries
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import cv2
from PIL import Image
from scipy.misc import toimage

#reading the image
myimage = cv2.imread('mahdi.png')

#plotting the image
cv2.imshow('mahdi',myimage)
cv2.waitKey(0)
cv2.destroyAllWindows()

#save
cv2.imwrite('newmahdi.png',myimage)

#get size of image
dimensions = myimage.shape
height = myimage.shape[0]
width = myimage.shape[1]
print('Image Dimension    : ',dimensions)
print('Image Height       : ',height)
print('Image Width        : ',width,'\n')

#read image and convert to array
myimage1=mpimg.imread('mahdi.png')
imtopix = np.array(myimage1)
print('image to matrix:','\n',imtopix)

#resize image without OPENCV function... use numpy instead
myimage2 =np.resize(imtopix,(200,200))
newimg = Image.fromarray(myimage2)
newimg.save('my.png')
newimg.show()

1 Ответ

0 голосов
/ 11 апреля 2019

Numpy's resize() не делает то, что вы думаете, что делает.Он не пересчитывает массив по своим осям.

Скажем, ваш исходный массив выглядит следующим образом:

array([
        [11, 12, 13, 14, 15],
        [21, 22, 23, 24, 25]
      ])

Тогда после a = np.resize(a, (3, 3)) результат будет выглядеть следующим образом:

array([
        [11, 12, 13],
        [14, 15, 21],
        [22, 23, 24]
      ])

Как видите, исходный первый ряд переходит во второй ряд и так далее, в то время как последний пиксель просто исчезает.Это происходит потому, что np.resize() фактически не меняет никаких данных.Он просто назначает другую форму данным, которые существуют в памяти, в то время как исходные строки остаются в последовательном порядке друг к другу (или столбцы, если вы использовали массив в стиле Фортрана).

То, что вы на самом деле хотите, это Подушкаresize():

newimg = Image.fromarray(imtopix)
newimg = newimg.resize((200, 200), resample=Image.BILINEAR)

Выберите метод повторной выборки, подходящий для вашего варианта использования.

...