Цветовая карта Jet в оттенки серого

У меня есть струйная цветовая карта:

цветовая карта струи

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

Я не могу найти в Google функцию для его преобразования. MATLAB использует что-то под названием rgb2ind, но я хотел бы знать формулу.


person PerroNoob    schedule 16.09.2011    source источник
comment
Jet единодушно считается одной из худших доступных цветовых карт, несмотря на ее популярность...   -  person heltonbiker    schedule 19.09.2012


Ответы (4)


Сначала позвольте мне создать индексированное изображение, используя палитру Jet:

img = repmat(uint8(0:255), 100, 1);
cmap = jet(256);

imshow(img, 'Colormap',cmap)

jet

Прямое преобразование с использованием IND2GRAY дает следующее:

J = ind2gray(img,cmap);
imshow(J)

jet_to_gray

Как вы выразились, min/max сходятся к одному и тому же значению. Насколько я понял, вы хотите отобразить цветовую карту струи, чтобы линейно перейти от темных к светлым оттенкам серого. Для этого мы можем изменить порядок, используя значение оттенка, которое мы получаем с помощью RGB2HSV. функция. Сравните следующее с исходной картой цветов:

[~,idx] = sortrows(rgb2hsv(cmap), -1);  %# sort by Hue
C = gray(256);
C = C(idx,:);

imshow(img, 'Colormap',C)

hue_sorted

person Amro    schedule 21.09.2011

создать изображение в MATLAB

image(1:64);axis off;colormap(jet);

сохраните изображение в формате tiff, обрежьте границы с помощью Paintbrush и сохраните как '\directorypath\jetmage.tiff'.

загрузить изображение в MATLAB

jetmage=imread('\\directorypath\jetmage.tiff');

получить размер изображения

[szX,szY,szZ]=size(jetmage);

получить строку изображения для каждого цвета, красного, зеленого и синего.

r=reshape(jetmage(uint8(szX/2),:,1),[szY,1]);
g=reshape(jetmage(uint8(szX/2),:,2),[szY,1]);
b=reshape(jetmage(uint8(szX/2),:,3),[szY,1]);

постройте профиль интенсивности для каждого цвета для этой строки.

plot(r,'r-');hold on;
plot(g,'g-');hold on;
plot(b,'b-');hold on;

Сюжет должен быть примерно таким:

введите здесь описание изображения

вы можете использовать массив [r,g,b] в качестве справочной таблицы или на основе этого найти способ получить «формулу» из массива [r,g,b]

person pangyuteng    schedule 16.09.2011

rgb2ind преобразует значения RGB для каждого пикселя в индексы в цветовой карте. Если вы используете 2-входную версию с вводом цветовой карты, она будет искать ближайший цвет в цветовой карте, который соответствует каждому пикселю. Это в основном даст вам одно число для каждого пикселя, а не значение RGB.

Например, если вы загружаете свое изображение

RGB = imread(imagefilename);

затем, поскольку карта цветов Jet возвращается jet, вы можете получить индексированные данные, используя

mapsize = 256;
map = jet(mapsize);
ind = rgb2ind(RGB, map);

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

colormap(map)
image(ind)
colormap('gray')

Не используйте imagesc, потому что это может неприемлемо расширить динамический диапазон вашего изображения.

person Nzbuu    schedule 20.09.2011

Реализация Python ответа, данного тенгом (при условии, что по умолчанию используется карта matplotlib).

import pylab as plt
import numpy as np
import matplotlib
import matplotlib.pyplot as plt


def PIL2array(img):
    return numpy.array(img.getdata(),
                numpy.uint8).reshape(img.size[1], img.size[0], 3)
def array2PIL(arr, size):
    mode = 'RGBA'
    arr = arr.reshape(arr.shape[0]*arr.shape[1], arr.shape[2])
    if len(arr[0]) == 3:
       arr = numpy.c_[arr, 255*numpy.ones((len(arr),1), numpy.uint8)]
    return Image.frombuffer(mode, size, arr.tostring(), 'raw', mode, 0, 1)

def return_x(y,color,direction):

    if color == "blue" and direction == "up":
       m = (4.0 + 6.0/11.0)
       c = 0.5
    elif color == "blue" and direction == "down":
       m = -3.226
       c = 2.097
    elif color == "green" and direction == "up":
       m = 4.0
       c = -0.5
    elif color == "green" and direction == "down":
       m = -3.704
       c = 3.370
    elif color == "red" and direction == "up":
       m = 3.223
       c = -1.129
    elif color == "red" and direction == "down":
       m = -4.545
       c = 5.041
    else:
       print "Returning y:: INCORRECT OPTIONS"
       m = 1
       c = 0

    return (y-c)/m 

# x >= y
def big_equal(x,y):
    return x > y or np.allclose(x,y)

# x <= y
def less_equal(x,y):
    return x < y or np.allclose(x,y)

def convert_jet_to_grey(img_array,n):
    new_image = np.zeros((img_array.shape[0],img_array.shape[1]))
    for i in range(img_array.shape[0]):
        for j in range(img_array.shape[1]):
            pixel_blue = img_array[i,j,2]
            pixel_green = img_array[i,j,1]
            pixel_red = img_array[i,j,0]
            if (pixel_blue < 1) and big_equal(pixel_blue,0.5) and less_equal(pixel_green,0.5) :
               #print "a1"
               #print "i,j = ",i,",",j
               new_image[i,j] = return_x(pixel_blue,"blue","up")**n
            elif np.allclose(pixel_blue,1.0) and big_equal(pixel_green,0):
                 #print "b1"
                 #print "i,j = ",i,",",j
                 new_image[i,j] = return_x(pixel_green,"green","up")**n
            elif (pixel_blue < 1) and big_equal(pixel_blue,0.4) and big_equal(pixel_green,0.5):
                 #print "c1"
                 #print "i,j = ",i,",",j
                 new_image[i,j] = return_x(pixel_green,"blue","down")**n
            elif (pixel_red < 1) and big_equal(pixel_red,0.4) and big_equal(pixel_green,0.5):
                 #print "c2"
                 #print "i,j = ",i,",",j
                 new_image[i,j] = return_x(pixel_green,"red","up")**n
            elif np.allclose(pixel_red,1.0) and big_equal(pixel_green,0):
                 #print "b2"
                 #print "i,j = ",i,",",j
                 new_image[i,j] = return_x(pixel_green,"green","down")**n
            elif (pixel_red < 1) and big_equal(pixel_red,0.5) and less_equal(pixel_green,0.5):
           #print "a2"
           #print "i,j = ",i,",",j
           new_image[i,j] = return_x(pixel_blue,"red","down")**n
        else:
           print "Leaving 0:: NOT A JET IMAGE"

return new_image

def main():


   img = Image.open('test.jpg')
   arr = PIL2array(img)

   img_new = convert_jet_to_grey(arr/255.0,1)
   imgplot = plt.imshow(img_new)
   plt.show()

if __name__ == '__main__':
   main()
person trienko    schedule 16.09.2014