Matlab色彩映射 - 如何只更改一个特定值,而不是一系列值?

时间:2015-03-05 17:57:06

标签: image matlab image-processing colormap

这是我在StackOverflow上的第一个问题,如果我犯了一些错误,请原谅我。

我必须使用MATLAB可视化多个单通道图像(2D矩阵)。每个像素的值通常介于~10^-10~10^-6之间。我正在使用翻转的jet色彩图(因此暗红色低而深蓝色高)。

现在,其中一些矩阵还包含一些0像素值。我想为这些像素设置一个特定的颜色(比如白色) 。我现在所做的是:

cmap = colormap('jet'); % standard 64 colors jet colormap 
cmap = flipud(cmap);

然后我尝试编辑色彩映射的第一行,并根据我在网上找到的不同答案(包括How do I change a single color in a colormap in Matlab?)将其设置为[1 1 1](白色):

cmap(1,:) = [1 1 1];
colormap(cmap);

问题在于,色彩映射的这种编辑将图像的第一个范围/ 64 值(我猜)设置为白色,而不是仅将0个设置为白色。

我想知道:是否可以将这些像素设置为白色?

我想我的问题取决于这样的事实,即使对于具有这些0个有价值像素的图像,第二低像素很多并且真正(按10^-10)的顺序。

非常感谢您提前!祝福!

UJIN

1 个答案:

答案 0 :(得分:1)

解决此问题的方法之一是使用所需的颜色贴图对图像进行实际编码,然后使用logical索引将原始图像中的每个位置设置为最终结果中的0到白色。

因此,给定您的2D图像,实际创建一个版本,使用ind2rgb映射到jet颜色图。之后,在原始图像中搜索0值,然后将最终彩色结果中的这些位置设置为白色。你问题的最后一点非常有意义。如果您的值介于这么小的范围之间,然后值也为0,则最终颜色映射中的颜色将偏向颜色映射的最末端。因此,我可以建议的另一件事是将原始图像的原始图像的值设置为非零范围内的值,以使其不会使颜色映射饱和。一旦您最终使用建议的颜色贴图转换图像,我们就可以手动将这些像素设置为白色。

假设您的图片存储在im中,请执行以下操作:

cmap = colormap('jet'); % standard 64 colors jet colormap 
cmap = flipud(cmap);
im2 = im;
ind = im == 0; %// Find locations that are zero in the original image
im2(ind) = max(im(:)); %// Make a copy of the original image where 0 pixels are set to the maximum of the image
rgb = ind2rgb(im2, cmap); %// Create pseudo-coloured image
rgb(repmat(ind, [1 1 3])) = 1; %// Set corresponding locations to white

如果您有图像处理工具箱,则可以使用imshow,也可以使用image来查看结果(即imshow(rgb)image(rgb))。< / p>

次要建议

我建议您将cmap = colormap('jet');更改为cmap = jet;,因为colormap('jet')如果您还没有打开,则会生成一个空的数字窗口。 cmap = jet;会给你相同的结果。