8

我有一个喷气式颜色图:

喷射色彩图

我想知道是否有某种方法可以转换为灰度。我不能使用平均值,因为最大值和最小值变为相同的灰色。或者,如果有某种方法可以转换为另一个调色板。

我在谷歌上找不到转换它的功能。MATLAB 使用了一些叫做rgb2ind但我想知道公式的东西。

4

4 回答 4

9

首先让我使用 Jet 颜色图创建一个索引图像:

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

imshow(img, 'Colormap',cmap)

喷射

使用 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)

色调排序

于 2011-09-21T00:15:34.753 回答
4

在 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]

于 2011-09-16T14:50:42.680 回答
1

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,因为它可能会不可接受地拉伸图像的动态范围。

于 2011-09-20T11:04:43.513 回答
0

teng 给出的答案的 Python 实现(假设默认的 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()
于 2014-09-16T14:56:47.513 回答