【问题标题】:Update RGB image values from row/column index从行/列索引更新 RGB 图像值
【发布时间】:2015-03-11 18:13:21
【问题描述】:

我想我真的错过了一些东西。 我有一个 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. 在我的测试中,这只适用于矩形区域。即,如果您有一个圆圈,这将突出显示外部正方形。

所以我提出了一个新问题:我从ind2sub 得到index_R, index_C。我应该改用线性索引吗?如何?这可能是一种只突出我需要的像素的方法。提前谢谢你。


我尝试过的事情

我试过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

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

【问题讨论】:

    标签: matlab image-processing


    【解决方案1】:

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

    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)
    

    输出:

    如果您只想要红色像素(我猜是纯饱和红色 :) 而没有别的,请将其他 2 个通道的值设置为 0:

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

    给出这个:

    【讨论】:

    • 如果这发生在循环中,不要在循环中执行“imshow”或“image”,而是尝试使用“imgHandle=imshow(whatever)”创建初始帧并执行“set(imgHandle, 'CData', newFrameData)" 在以下帧中。这种方法不会一直拉图窗口到前面,速度也更快。
    • @user3528438 如果你也能帮助我,我想 :)
    猜你喜欢
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2016-06-21
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    相关资源
    最近更新 更多