我有一个8位灰度图像,其值不同(0,1,2,3,4,...,255)。我想要做的是用灰色,红色等颜色为灰度图像着色。到目前为止,我一直在进行这种着色,但仅限于灰度。我怎么能用实际的颜色来做呢?
这是我到目前为止编写的代码。这是我在搜索图像中所有白色值并用深灰色替换它们的地方:
for k = 1:length(tifFiles)
baseFileName = tifFiles(k).name;
fullFileName = fullfile(myFolder, baseFileName);
fprintf(1, 'Now reading %s\n', fullFileName);
imageArray = imread(fullFileName);
%// Logic to replace white grayscale values with darkish gray here
ind_plain = find(imageArray == 255);
imageArray(ind_plain) = 50;
imwrite(imageArray, fullFileName);
end
答案 0 :(得分:6)
您要问的是执行pseudo colouring图像。在MATLAB中执行此操作实际上非常简单。您可以使用灰度强度作为颜色图的索引,每个强度都会生成一种独特的颜色。首先,您需要做的是创建一个长256个元素的颜色贴图,然后使用ind2rgb
根据图像的灰度强度/索引创建彩色图像。
MATLAB中有许多不同的颜色贴图。以下是MATLAB中当前可用的色彩映射,没有最近添加的R2014中引入的Parula色彩图:
色彩图的工作原理是较低的索引/灰度值具有向光谱左侧移动的颜色,较高的索引/灰度值具有向光谱右侧移动的颜色。
如果要创建包含256个元素的颜色贴图,只需将这些颜色贴图中的任何一个用作函数,并指定256作为输入参数即可为您生成256个元素颜色贴图。例如,如果您想使用HSV颜色映射,可以在MATLAB中执行此操作:
cmap = hsv(256);
现在,鉴于MATLAB工作区中的灰度图像存储在imageArray
中,只需使用ind2rgb
这样:
colourArray = ind2rgb(double(imageArray)+1, cmap);
第一个参数是您想要伪彩色的灰度图像,第二个参数是由MATLAB的任何一个颜色映射函数生成的颜色图。 colourArray
将包含伪彩色图像。请注意,我们将灰度图像偏移为1,并且强制转换为double
。原因是因为MATLAB是1索引编程语言,所以我们必须从1开始索引到数组/矩阵。因为你的强度范围从[0,255]
,我们想用它来索引到色彩映射,我们必须从[1,256]
开始,以允许索引。此外,您最有可能使用uint8
图片,因此向uint8
添加1只会使任何已经达到255到255的值饱和。我们无法前往256.因此,您需要暂时将图像转换为double
,以便我们可以提高图像的精度,然后加1以允许图像在需要时变为256。
以下是使用图像处理工具箱中cameraman.tif
图片的示例。这就是它的样子:
因此我们可以在MATLAB中加载该图像,如下所示:
imageArray = imread('cameraman.tif');
接下来,我们可以使用上面的图像,生成HSV色彩图,然后伪彩色图像:
cmap = hsv(256);
colourArray = ind2rgb(imageArray+1, cmap);
我们得到:
请注意,您没有 使用MATLAB提供的任何颜色贴图。实际上,您可以创建自己的颜色映射。您所要做的就是创建一个256 x 3矩阵,其中每列表示每个强度的红色(第一列),绿色(第二列)和蓝色(第三列)值的比例。因此,第一行为您提供映射到强度0的颜色,第二行为您提供映射到强度1的颜色,依此类推。此外,您需要确保强度浮点且范围为[0,1]
。例如,这些是上面生成的HSV颜色映射的前10行:
>> cmap(1:10,:)
ans =
1.0000 0 0
1.0000 0.0234 0
1.0000 0.0469 0
1.0000 0.0703 0
1.0000 0.0938 0
1.0000 0.1172 0
1.0000 0.1406 0
1.0000 0.1641 0
1.0000 0.1875 0
1.0000 0.2109 0
然后,您可以将此自定义颜色映射用于ind2rgb
以伪彩您的图像。
祝你好运,玩得开心!