Matlab colormap - 如何只更改一个特定值,而不是一系列值?
Matlab colormap - How can I change only ONE specific value, not a range of values?
这是我在 Whosebug 上的第一个问题,如有错误请见谅。
我必须使用 MATLAB 可视化多个单通道图像(二维矩阵)。每个像素的值通常介于 ~10^-10
和 ~10^-6
之间。我正在使用翻转的 jet
颜色图(因此深红色低,深蓝色高)。
现在,其中一些矩阵还包含一些 0
像素值。我想为这些像素设置特定颜色(比如白色)仅。我现在所做的是:
cmap = colormap('jet'); % standard 64 colors jet colormap
cmap = flipud(cmap);
然后我尝试编辑颜色图的第一行并将其设置为 [1 1 1]
(白色),遵循我在网上找到的不同答案(包括 How do I change a single color in a colormap in Matlab?):
cmap(1,:) = [1 1 1];
colormap(cmap);
问题是颜色图的这种编辑将图像的第一个 range/64 值(我猜)设置为白色,而不是仅设置 0
个变白。
我想知道:是否可以将仅那些像素设置为白色?
我想我的问题取决于这样一个事实,即即使对于具有这些少数 0
值像素的图像,第二低的像素也是 许多 并且实际上 small(顺序为10^-10
).
非常感谢您!祝福!
宇进
解决此问题的一种方法是使用所需的颜色图对图像进行实际编码,然后使用 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)
) .
小建议
我建议您将 cmap = colormap('jet');
更改为 cmap = jet;
,因为如果您还没有打开 colormap('jet')
会生成一个空图形 window。 cmap = jet;
会给你同样的结果。
这是我在 Whosebug 上的第一个问题,如有错误请见谅。
我必须使用 MATLAB 可视化多个单通道图像(二维矩阵)。每个像素的值通常介于 ~10^-10
和 ~10^-6
之间。我正在使用翻转的 jet
颜色图(因此深红色低,深蓝色高)。
现在,其中一些矩阵还包含一些 0
像素值。我想为这些像素设置特定颜色(比如白色)仅。我现在所做的是:
cmap = colormap('jet'); % standard 64 colors jet colormap
cmap = flipud(cmap);
然后我尝试编辑颜色图的第一行并将其设置为 [1 1 1]
(白色),遵循我在网上找到的不同答案(包括 How do I change a single color in a colormap in Matlab?):
cmap(1,:) = [1 1 1];
colormap(cmap);
问题是颜色图的这种编辑将图像的第一个 range/64 值(我猜)设置为白色,而不是仅设置 0
个变白。
我想知道:是否可以将仅那些像素设置为白色?
我想我的问题取决于这样一个事实,即即使对于具有这些少数 0
值像素的图像,第二低的像素也是 许多 并且实际上 small(顺序为10^-10
).
非常感谢您!祝福!
宇进
解决此问题的一种方法是使用所需的颜色图对图像进行实际编码,然后使用 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)
) .
小建议
我建议您将 cmap = colormap('jet');
更改为 cmap = jet;
,因为如果您还没有打开 colormap('jet')
会生成一个空图形 window。 cmap = jet;
会给你同样的结果。