Струйная карта цветов в оттенках серого - PullRequest
7 голосов
/ 16 сентября 2011

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

jet colormap

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

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

Ответы [ 4 ]

9 голосов
/ 21 сентября 2011

Сначала позвольте мне создать индексированное изображение, используя цветовую карту 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

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

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

imshow(img, 'Colormap',C)

hue_sorted

3 голосов
/ 16 сентября 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;

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

enter image description here

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

0 голосов
/ 16 сентября 2014

Реализация 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()
0 голосов
/ 20 сентября 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, поскольку это может привести к недопустимому расширению динамического диапазона изображения.

...