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

Image MATLAB:查找一个数组中的值,并使用这些位置更改单独3通道数组中一个通道中的值,image,matlab,image-processing,Image,Matlab,Image Processing,所以我有一个带标签的数组1,它的连接区域背景都是零,连接区域第一个区域都是1,第二个区域都是2,第三个区域都是3,等等。我还有一个区域标签的向量向量1,我发现重要的例子1,6,9。我想在带标签的数组中找到这些值的位置,然后在相同位置更改单独3通道数组的一个通道中的值。我想将图像的某些部分涂成绿色,在另一个图像中找到感兴趣的区域 我可以使用下面的代码更改所有通道,但不知道如何指定imgy,x,1=0,imgy,x,2=0,imgy,x,3=255 for i=1:1:length(vector1)

所以我有一个带标签的数组1,它的连接区域背景都是零,连接区域第一个区域都是1,第二个区域都是2,第三个区域都是3,等等。我还有一个区域标签的向量向量1,我发现重要的例子1,6,9。我想在带标签的数组中找到这些值的位置,然后在相同位置更改单独3通道数组的一个通道中的值。我想将图像的某些部分涂成绿色,在另一个图像中找到感兴趣的区域

我可以使用下面的代码更改所有通道,但不知道如何指定imgy,x,1=0,imgy,x,2=0,imgy,x,3=255

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

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

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

因此,请执行以下操作:

%// 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=[13],所以我们可以改变这些对象。标签设置为左上角的正方形为标签1,中间为标签2,右下角为标签3

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


您可以通过两行代码实现它-

%// 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
注意array1中值[1,6,9]的位置,以及代码运行前后img1中相应值的变化