Выключено при одной ошибке в imshow?

Я рисую изображение PGM: данные, которые я использую. Проблема в том, что некоторые из показанных пикселей неверны. Например: три серых прямоугольника в верхней части изображения имеют значение 11 (поэтому они должны ...

Я рисую изображение PGM: данные, которые я использую. Проблема в том, что некоторые из показанных пикселей неверны. Например: три серых прямоугольника в верхней части изображения имеют значение 11 (поэтому они должны ...

Я рисую изображение PGM: enter image description here Вот данные , которые я использую.

Проблема в том, что некоторые из показанных пикселей неверны. Например:

  • три серых прямоугольника в верхней части изображения имеют значение 11 (поэтому они должны быть красными, а не красными)
  • два желтых пикселя в верхнем ряду - они имеют значение 8, поэтому они должны быть желто-зелеными, а не желтыми

Кто-нибудь может объяснить расхождения и как их исправить?

Вот мой источник:

from pylab import *
import numpy    
LABELS = range(13)
NUM_MODES = len(LABELS)
def read_ascii_pgm(fname):
    """
    Very fragile PGM reader.  It's OK since this is only for reading files
    output by my own app.
    """
    lines = open(fname).read().strip().split('\n')
    assert lines[0] == 'P2'
    width, height = map(int, lines[1].split(' '))
    assert lines[2] == '13'
    pgm = numpy.zeros((height, width), dtype=numpy.uint8)
    for i in range(height):
        cols = lines[3+i].split(' ')
        for j in range(width):
            pgm[i,j] = int(cols[j])
    return pgm
def main():
    import sys
    assert len(sys.argv) > 1
    fname = sys.argv[1]
    pgm = read_ascii_pgm(fname)
    # EDIT: HACK!
    pgm[0,0] = 12
    cmap = cm.get_cmap('spectral', NUM_MODES)
    imshow(pgm, cmap=cmap, interpolation='nearest')
    edit = True
    if edit:
        cb = colorbar()
    else:
        ticks = [ (i*11./NUM_MODES + 6./NUM_MODES) for i in range(NUM_MODES) ]
        cb = colorbar(ticks=ticks)
        cb.ax.set_yticklabels(map(str, LABELS))
    savefig('imshow.png')
if __name__ == '__main__':
    main()

РЕДАКТИРОВАТЬ

Теперь я вижу, что здесь происходит. По сути, imshow , похоже, делает следующее:

  • определяет динамический диапазон (поскольку [min (изображение), max (изображение)]
  • представляют это с использованием количества цветов, указанного в цветовая карта (13 цветов)

Я хочу, чтобы она делала:

  • используют динамический диапазон, который я указал при создании цветовой карты (13)
  • представляют это, используя 13 цветов в цветовой карте

Я могу проверить это, установив динамический диапазон изображения равным 13 ( см. строку HACK ). Есть ли лучший способ сделать это?

Вот обновленное изображение: enter image description here

5
задан mpenkov 25 May 2011 в 17:23
поделиться