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