在 MATLAB 中为 8 位灰度图像着色
Coloring an 8-bit grayscale image in MATLAB
我有一个具有不同值 (0,1,2,3,4,..., 255) 的 8 位灰度图像。我想要做的是用蓝色、红色等颜色为灰度图像着色。到目前为止,我一直在进行这种着色,但只是在灰度中进行。我怎样才能用实际颜色做到这一点?
这是我到目前为止编写的代码。这是我搜索图像中所有白色值并将其替换为深灰色的地方:
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
您要的是执行 pseudo colouring of an image. Doing this in MATLAB is actually quite easy. You can use the grayscale intensities as an index into a colour map, and each intensity would generate a unique colour. First, what you need to do is create a colour map that is 256 elements long, then use ind2rgb
以根据图像的灰度强度/索引创建彩色图像。
在 MATLAB 中有许多不同的颜色图可供您使用。以下是 MATLAB 中当前可用的颜色图,没有最近添加的在 R2014 中引入的 Parula 颜色图:
颜色图的工作原理是较低的指数/灰度值具有向光谱左侧移动的颜色,而较高指数/灰度值具有向光谱右侧移动的颜色。
如果您想创建一个包含 256 个元素的色图,您只需使用这些色图中的任何一个作为函数并指定 256 作为输入参数即可为您生成一个 256 元素的色图。例如,如果您想使用 HSV 颜色图,您可以在 MATLAB 中这样做:
cmap = hsv(256);
现在,假设您的 MATLAB 工作区中的灰度图像存储在 imageArray
中,只需这样使用 ind2rgb
:
colourArray = ind2rgb(double(imageArray)+1, cmap);
第一个参数是你想要伪彩色的灰度图像,第二个输入是由任何一个 MATLAB 颜色映射函数生成的颜色图。 colourArray
将包含您的伪彩色图像。请注意,我们 offset 灰度图像 1,并且 cast 为 double
。这样做的原因是因为 MATLAB 是一种索引为 1 的编程语言,所以我们必须从 1 开始索引到数组/矩阵。因为你的强度范围从 [0,255]
,我们想用这个索引到色图,我们必须使它从 [1,256]
开始以允许索引。此外,您很可能正在使用 uint8
图像,因此将 1 添加到 uint8
只会使任何已经在 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
以伪彩色您的图像。
祝你好运,玩得开心!
我有一个具有不同值 (0,1,2,3,4,..., 255) 的 8 位灰度图像。我想要做的是用蓝色、红色等颜色为灰度图像着色。到目前为止,我一直在进行这种着色,但只是在灰度中进行。我怎样才能用实际颜色做到这一点?
这是我到目前为止编写的代码。这是我搜索图像中所有白色值并将其替换为深灰色的地方:
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
您要的是执行 pseudo colouring of an image. Doing this in MATLAB is actually quite easy. You can use the grayscale intensities as an index into a colour map, and each intensity would generate a unique colour. First, what you need to do is create a colour map that is 256 elements long, then use ind2rgb
以根据图像的灰度强度/索引创建彩色图像。
在 MATLAB 中有许多不同的颜色图可供您使用。以下是 MATLAB 中当前可用的颜色图,没有最近添加的在 R2014 中引入的 Parula 颜色图:
颜色图的工作原理是较低的指数/灰度值具有向光谱左侧移动的颜色,而较高指数/灰度值具有向光谱右侧移动的颜色。
如果您想创建一个包含 256 个元素的色图,您只需使用这些色图中的任何一个作为函数并指定 256 作为输入参数即可为您生成一个 256 元素的色图。例如,如果您想使用 HSV 颜色图,您可以在 MATLAB 中这样做:
cmap = hsv(256);
现在,假设您的 MATLAB 工作区中的灰度图像存储在 imageArray
中,只需这样使用 ind2rgb
:
colourArray = ind2rgb(double(imageArray)+1, cmap);
第一个参数是你想要伪彩色的灰度图像,第二个输入是由任何一个 MATLAB 颜色映射函数生成的颜色图。 colourArray
将包含您的伪彩色图像。请注意,我们 offset 灰度图像 1,并且 cast 为 double
。这样做的原因是因为 MATLAB 是一种索引为 1 的编程语言,所以我们必须从 1 开始索引到数组/矩阵。因为你的强度范围从 [0,255]
,我们想用这个索引到色图,我们必须使它从 [1,256]
开始以允许索引。此外,您很可能正在使用 uint8
图像,因此将 1 添加到 uint8
只会使任何已经在 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
以伪彩色您的图像。
祝你好运,玩得开心!