所以我有一个标记的数组(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
答案 0 :(得分:0)
如果我理解正确,你有一个对象的标签图 - 每个都有一个关联的ID,背景为0。您还有一个重要ID矢量和一个与此标签图关联的彩色图像。
您希望将具有重要ID的所有位置设置为1种颜色。我首先创建一个逻辑掩码,其中true
表示像素很重要,否则false
。我的意思是重要的是,如果我们按照你的例子,像素是1,6或9。您可以使用bsxfun
与any
结合创建此蒙版,然后我们可以使用它来索引图像并为这些位置设置正确的颜色。
因此,请执行此操作:
%// 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.
一旦我这样做并运行上面的代码,这就是我得到的图像:
答案 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
中相应的值更改。