Matlab色图 - 如何仅更改一个特定值,而不是一系列值?

4
这是我在StackOverflow上的第一个问题,如果有错误请见谅。
我需要使用MATLAB可视化多个单通道图像(2D矩阵)。每个像素的值通常在~10^-10~10^-6之间。我正在使用翻转的jet色图(因此深红色为低值,深蓝色为高值)。
现在,其中一些矩阵还包含一些0像素值。我想为这些像素设置特定颜色(比如白色),仅限于这些像素。我目前所做的是:
cmap = colormap('jet'); % standard 64 colors jet colormap 
cmap = flipud(cmap);

然后我尝试编辑色图的第一行,并将其设置为[1 1 1](白色),这是根据我在网上找到的不同答案(包括如何在Matlab中更改色图中的单个颜色?):

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

问题在于这种颜色映射的编辑设置了图像的前range/64个值为白色,而不是仅将0的值设置为白色。我猜测问题是:是否可能仅将那些像素设置为白色?我觉得我的问题取决于即使对于这些只有少量0值像素的图像,第二低的像素也很多,而且真的很小(在10^-10的级别)。非常感谢您的帮助!祝一切顺利!UJIN
1个回答

1

解决这个问题的一种方法是使用所需的颜色映射对图像进行编码,然后使用逻辑索引将原始图像中为0的每个位置设置为最终结果中的白色。

因此,给定您的2D图像,实际上创建一个使用jet颜色映射映射的版本,使用ind2rgb。之后,在原始图像中搜索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))。

小建议

我建议您将cmap = colormap('jet');更改为cmap = jet;,因为colormap('jet')会在没有打开窗口的情况下生成一个空的图形窗口。cmap = jet;将给您相同的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接