Цветовая карта Jet в оттенки серого
У меня есть цветовая карта jet:
и я хотел бы знать, есть ли способ преобразовать в оттенки серого. Я не могу использовать среднее, потому что максимальное и минимальное значения имеют одинаковый серый цвет. Или если есть какой-то способ конвертировать в другую цветовую палитру.
Я не могу найти в Google функцию для ее преобразования. MATLAB использует какую-то вещь под названием rgb2ind
но я хотел бы знать формулу.
4 ответов
сначала позвольте мне создать индексированное изображение с помощью Jet colormap:
img = repmat(uint8(0:255), 100, 1);
cmap = jet(256);
imshow(img, 'Colormap',cmap)
простое преобразование с использованием IND2GRAY производит следующее:
J = ind2gray(img,cmap);
imshow(J)
как вы выразились, min / max сходятся к тому же значению. Из того, что я понял, вы хотите отобразить цветовую карту jet, чтобы линейно перейти от темных к светлым оттенкам серого. Для этого мы можем изменить порядок с помощью значения оттенка что мы получаем с функцией RGB2HSV. Сравните следующее с исходной цветовой картой:
[~,idx] = sortrows(rgb2hsv(cmap), -1); %# sort by Hue
C = gray(256);
C = C(idx,:);
imshow(img, 'Colormap',C)
создайте изображение в 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;
сюжет должен быть чем-то вроде Итак:
вы можете использовать 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()