在Matlab中将颜色像素添加到灰度图像

时间:2014-12-02 18:52:14

标签: image matlab image-processing colors grayscale

我有一个灰度图像(128x128像素,作为uint8导入到Matlab中,我用im2double将其转换为double用于我的分析)。使用我编写的另一个脚本,我识别出图像中感兴趣的像素,这些像素位于大小为1 * k的单元格数组中(其中k是点数;该数组中的每个单元格,我和#39 ; ve(称为mypoints)具有图像中像素的坐标。

我想要做的是拍摄原始图像,并将这些单元格用红色(或其他任何颜色)着色。我无法找到将双图像更改为RGB的好方法(它不会给出三维矩阵,就像彩色图像一样),而且我试图叠加一个空白这些像素在图像上方着色的图形,但我还没有运气。

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:4)

我将假设您的单元格数组中的每个坐标都以(x,y)方式存储,其中xy表示列< / em>和您希望在图像中显示红色的像素。

为了使其快速且向量化,将所有单元格元素解压缩为2D矩阵,其中第一列表示x或列坐标,然后第二列表示y或行坐标。您可以使用vertcat这样做:

pixels = vertcat(mypoints{:});

mypoints将是您正在谈论的点数的单元格数组(see your previous question regarding if/else statements)。执行此操作后,我将使用sub2ind将列和行坐标转换为线性索引,然后使用此选项将图像中的位置设置为红色。但是,要创建RGB图像,您需要创建一个3D矩阵,使得有三个平面,每个平面具有相同的灰度图像。

如果您还不知道,RGB色彩空间中的灰度像素都具有相同的红色,绿色和蓝色值。因此,灰色为(R,G,B) = (128.128,128)。因此,请创建三个图像副本,并将其称为redgreenblue。然后,使用您在sub2ind中找到的位置,将red中的这些位置设置为255,将greenblue中的相同位置设置为0.因此,假设您图像存储在im中,执行以下操作:

pixels = vertcat(mypoints{:});
ind = sub2ind(size(im), pixels(:,2), pixels(:,1));
red = im;
red(ind) = 255;
green = im;
green(ind) = 0;
blue = im;
blue(ind) = 0;
out_image = cat(3, red, green, blue);
imshow(out_image);

这是一个简单的例子。假设我加载了内置于MATLAB的cameraman.tif图像,并且是uint8和灰度图像。让我们在图像中生成一堆随机坐标...总共大约200个...将它们放入一个像你一样的单元格数组并调用它mypoints,并运行以下代码:< / p>

rng(123); %// Set seed for reproducibility
im = imread('cameraman.tif');
N = 200; %// Number of pixels I want to set
rows = randi(size(im,1), N, 1);
cols = randi(size(im,2), N, 2);
mypoints = arrayfun(@(x) [cols(x) rows(x)], 1:N, 'uni', 0);

您不需要了解我在上面所做的事情,但关键是它在图像中读取,我们在图像中生成200个随机的行和列位置。然后我们创建一个单元格数组,其中每个元素都是一个2元素数组,其中包含图像中特定像素的列和行位置。 randi允许您生成从1到指定最大值的随机整数,并且可以指定将存储这些随机数的输出矩阵的大小。我只是创建了一个行{列}位置的N=200元素向量。然后我使用arrayfun遍历每对点并将它们作为元素放入单元格数组中。 uni=0标志对我们来说很重要。


mypoints成为您想要的单元格数组时,这就是我运行代码时将红色像素放在所需位置的代码:

enter image description here

如您所见,图像中的随机像素以红色着色,这些位置由mypoints单元格数组提供。


玩得开心!