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

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

jet colormap

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

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

4 ответов


сначала позвольте мне создать индексированное изображение с помощью Jet colormap:

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 сходятся к тому же значению. Из того, что я понял, вы хотите отобразить цветовую карту jet, чтобы линейно перейти от темных к светлым оттенкам серого. Для этого мы можем изменить порядок с помощью значения оттенка что мы получаем с функцией RGB2HSV. Сравните следующее с исходной цветовой картой:

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

imshow(img, 'Colormap',C)

hue_sorted


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

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

сохраните изображение как tiff, обрезайте границы кистью и сохраните как ' \directorypath\jetmage.Тифф.

загрузите изображение в 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;

сюжет должен быть чем-то вроде Итак:

enter image description here

вы можете использовать array [r,g,b] как таблиц или базы на что выясните, как получить "формулу" из array [r,g,b]


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, потому что это может растянуть динамический диапазон вашего изображения неприемлемо.


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

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()