从行/列索引更新RGB图像值

时间:2015-03-10 17:52:03

标签: matlab image-processing

我想我在这里真的错过了什么。 我有一个RGB图像image作为M*N*3矩阵。我已经在这张图片中发现了一些我想成为的区域,比如纯饱和红色。我的地区来自bwconncomp加上其他东西;我已将行和列值存储在两个向量中:

[index_R, index_C] = ind2sub(*stuff*);

所以length(index_R) = length(index_C) < M*N等于属于我所在地区的像素数,我想变成红色。如何使用像素索引更新image中的值?

我唯一可以带来的是:

for i = 1:length(index_R)
    image(index_R(i), index_C(i)) = [255 0 0];
end

我还没有测试过。它是否正确?这是唯一的,更短,更优雅的配方吗?


回应@Benoit的回答

根据建议我尝试拨打image(index_R, index_C, 1)。但是,我在这里看到两个问题 - 如果我错了,请纠正我:

  1. 如果我的图像是5000 * 5000,我想在其中突出显示1M像素(合法,因为总计数为25M),im(index_R, index_C, 1)将返回1M * 1M矩阵(有一些重复,我猜),这对性能来说似乎很糟糕。是吗?
  2. 在我的测试中,这仅适用于矩形区域。即,如果你有一个圆圈,这将突出显示外部正方形。
  3. 所以我提出了一个新问题:我从index_R, index_C获得ind2sub。我应该使用线性指数吗?怎么样?这可能是一种突出我需要的像素的方法。提前谢谢。


    我尝试过的事情

    我试过了im(linear_indices, 1) = 255,但我得到了

     Maximum variable size allowed by the program is exceeded.
    

    试图将它拆分,比如im(linear_indices(1:length(linear_indices)/2), 1) = 255,我会失去记忆。真的卡住了。

    我也试过了im(linear_indices) = 255,它完美无缺(快速,只突出我需要的东西)。但它只适用于红色通道。我怎么能得到蓝色和绿色,因为im(linear_indices, 2)im(linear_indices, 3)给出了最大可变大小错误?


    我的最终解决方案

    鉴于线性指数也应涵盖第二和第三通道,我想出了

    im(linear_indices) = 255 %Red
    im(linear_indices+M*N) = 0 %green
    im(linear_indices+2*M*N) = 0 %blue
    

    如果您有更好的解决方案,请随时回答。

1 个答案:

答案 0 :(得分:0)

您可以避免循环并使用简单的索引,如下所示:

Im(index_R,index_C,1) = 255;

只为红色通道指定像素值255。请注意,建议不要使用image作为变量名,因为它是Matlab中的函数。

以下是使用演示图像的示例:

clear
clc

Im = imread('peppers.png');

%// Create dummy linear indices. A square in the image here...
[row,col,ch] = size(Im);

a = round(row/4:3*row/4);

LinIndices = sub2ind([row col],a,a);

[index_R,index_C] = ind2sub([row ,col],LinIndices);

%// Forget the loop. Assign a pixel vale of 255 to the red channel.
Im(index_R,index_C,1) = 255;

imshow(Im)

输出:

enter image description here

如果您只想要红色像素(纯粹的饱和红色,我猜:)和其他任何内容,请将其他2个通道值设置为0:

Im(index_R,index_C,2:3) = 0;

给予:

enter image description here