2013-11-21 5 views
0

У меня есть в моем коде два способа сохранить данные изображения, один только сохранить его значения в оттенках серого, а другой для генерации тепла изображения карты:Те же данные, сохраненные создавать различные образы - Python

def save_image(self, name): 
    """ 
    Save an image data in PNG format 
    :param name: the name of the file 
    """ 
    graphic = Image.new("RGB", (self.width, self.height)) 
    putpixel = graphic.putpixel 
    for x in range(self.width): 
     for y in range(self.height): 
      color = self.data[x][y] 
      color = int(Utils.translate_range(color, self.range_min, self.range_max, 0, 255)) 
      putpixel((x, y), (color, color, color)) 
    graphic.save(name + ".png", "PNG") 

def generate_heat_map_image(self, name): 
    """ 
    Generate a heat map of the image 
    :param name: the name of the file 
    """ 
    #self.normalize_image_data() 
    plt.figure() 
    fig = plt.imshow(self.data, extent=[-1, 1, -1, 1]) 
    plt.colorbar(fig) 
    plt.savefig(name+".png") 
    plt.close() 

Класс что представляет мои данные это:

class ImageData: 
def __init__(self, width, height): 
    self.width = width 
    self.height = height 
    self.data = [] 
    for i in range(width): 
     self.data.append([0] * height) 

Проходя те же данные для обоих методов

ContourMap.save_image ("ImagesOutput/Varia bilityOfGradients/ContourMap ") ContourMap.generate_heat_map_image (" ImagesOutput/VariabilityOfGradients/ContourMapHeatMap ")

Я получаю одно изображение повернуты по отношению к другому.

Метод 1:

save_image

Метод 2:

generate_heat_map_image

Я не понимаю, почему, но я должен это исправить.

Любая помощь будет оценена по достоинству. Спасибо заранее.

+1

В качестве побочного примечания, почему вы используете ['putpixel'] (http://pillow.readthedocs.org/en/latest/reference/Image.html#PIL.Image.Image.putpixel) в первую очередь ? Это самый медленный способ создания изображения, особенно в старых версиях PIL/Pillow. Почему бы просто не перевести массив с помощью одной векторной операции, а затем просто скопировать все сразу? Или использовать 'ImageDraw'? Или что-нибудь еще? – abarnert

+0

Я просто дал вам два разных совета, а также ссылку на документы, которые имеют более обширные советы. – abarnert

ответ

1

По-видимому, данные находятся в строчном формате, но вы выполняете итерацию, как если бы она была в формате столбца, который вращает все это на -90 градусов.

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

color = self.data[x][y] 

... с этим:

color = self.data[y][x] 

(Хотя предположительно data является массивом, так что вы действительно должны использовать self.data[y, x] вместо этого.)

Более четкое исправление:

for row in range(self.height): 
    for col in range(self.width): 
     color = self.data[row][col] 
     color = int(Utils.translate_range(color, self.range_min, self.range_max, 0, 255)) 
     putpixel((col, row), (color, color, color)) 

Это может быть не совсем ясно из документации pyplot, но если вы посмотрите на imshow, он объясняет, что он принимает массив объект, похожий по форме (п, м) и отображает его в качестве MxN изображения.

+0

Итак, я могу инициализировать свои данные следующим образом: self.data = [] для i в диапазоне (высота): self.data.append ([0] * width), чтобы исправить это? Извините, но я новичок в Python. – pceccon

+0

@pceccon: Вы пытаетесь изменить версию 'imshow', чтобы она соответствовала вашей версии' putpixel', или наоборот?Если 'imshow' верен, оставьте свои данные в покое и измените способ, которым вы его обходите в' save_image' (как в моем ответе). Если 'ifshow' ошибочно, измените способ создания данных. – abarnert

 Смежные вопросы

  • Нет связанных вопросов^_^