MATLAB:在一个数组中查找值并使用这些位置更改单独3通道数组的一个通道中的值

时间:2015-04-12 03:21:23

标签: image matlab image-processing

所以我有一个标记的数组(array1),其中连接的感兴趣区域(背景全为零,第一个区域的连接区域全部为1,第二个区域的所有2' s为3' ; s为第3等)我也有一个我发现重要的区域标签的矢量(vector1)(例如1,6,9)。我想在标记的数组中找到这些值的位置,然后在相同位置的单独3通道阵列的一个通道中更改值(想要在另一个图像中找到的图像绿色基于感兴趣区域的某些部分着色)。

我可以使用以下代码更改所有频道,但不知道如何指定(img(y,x,1 = 0),img(y,x,2 = 0),img(y)中,x,3 = 255))。

for i=1:1:length(vector1)
    img(array1==vector1(i))=255;
end

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你有一个对象的标签图 - 每个都有一个关联的ID,背景为0。您还有一个重要ID矢量和一个与此标签图关联的彩色图像。

您希望将具有重要ID的所有位置设置为1种颜色。我首先创建一个逻辑掩码,其中true表示像素很重要,否则false。我的意思是重要的是,如果我们按照你的例子,像素是1,6或9。您可以使用bsxfunany结合创建此蒙版,然后我们可以使用它来索引图像并为这些位置设置正确的颜色。

因此,请执行此操作:

%// Create your logical mask
mask3D = bsxfun(@eq, array1, permute(vector(:), [3 2 1]));
mask = any(mask3D, 3);

%// Set the image pixels to blue at these locations
red = img(:,:,1);
green = img(:,:,2);
blue = img(:,:,3);
red(mask) = 0;
green(mask) = 0;
blue(mask) = 255;

img = cat(3, red, green, blue);

这是一个快速的示例运行。假设我们有正方形的图像:

我们可以看到有三个方块。让我们将对象1和对象3更改为蓝色。在我们这样做之前,我们需要获得标签图:

%// Originally a binary image
im = imread('http://i.stack.imgur.com/DnYQS.png');

%// Get label map 
array1 = bwlabel(im);

%// Create colour version out of this binary image
img = 255*uint8(im);
img = cat(3, img, img, img);

array1是我们的标签地图,您在问题中也提到过,img是输入图像的颜色版本。现在,vector = [1 3]以便我们可以更改这些对象。标签是这样的,左上方是标签1,中间是标签2,右下方是标签3.

一旦我这样做并运行上面的代码,这就是我得到的图像:

enter image description here

答案 1 :(得分:0)

你可以用两行来实现它 -

%// Create a 3D mask to select the labels [1,6,9] only, as listed in "vector1"
mask = bsxfun(@and,ismember(array1,vector1),ones(1,1,3));

%// Map "img" with "mask" and set them to tuple:[0,0,255] (blue color)
img(mask) = reshape(repmat([0 0 255],nnz(mask)/3,1),[],1)

示例运行 -

array1 =  %// Input
     2     0     1     1     0     6
     0     0     1     0     0     6
     9     0     0     0     0     6
     9     9     0     4     0     0
vector1 =  %// Input
     1     6     9
img(:,:,1) =   %// Input: Before code run
   228    19   175    30   192   188
   204    23    34   164   149   248
   188   204   185    84   189   222
    14   241    29   167    60    22
img(:,:,2) =
    94   202   197    59   200   136
    95    94    53   164    26    24
   175    53   100   124    75   104
   153    23   141    39    61    27
img(:,:,3) =
    29   246   111    48   197   172
   201   111   168    68   101   110
    75   178    28   204    70   116
   154   194   239   125    10   156
img(:,:,1) =   %// Output: After code run
   228    19     0     0   192     0
   204    23     0   164   149     0
     0   204   185    84   189     0
     0     0    29   167    60    22
img(:,:,2) =
    94   202     0     0   200     0
    95    94     0   164    26     0
     0    53   100   124    75     0
     0     0   141    39    61    27
img(:,:,3) =
    29   246   255   255   197   255
   201   111   255    68   101   255
   255   178    28   204    70   255
   255   255   239   125    10   156

注意[1,6,9]中值array1的位置以及代码运行前后img1中相应的值更改。