Matlab 从行/列索引更新RGB图像值
我想我真的错过了一些东西。 我有一个RGB图像作为M*N*3矩阵。我在这张图片中找到了一些我想变成的区域,比如说,纯饱和红色。我的区域来自bwconncomp和其他东西;我已将行和列值存储在两个向量中:Matlab 从行/列索引更新RGB图像值,matlab,image-processing,Matlab,Image Processing,我想我真的错过了一些东西。 我有一个RGB图像作为M*N*3矩阵。我在这张图片中找到了一些我想变成的区域,比如说,纯饱和红色。我的区域来自bwconncomp和其他东西;我已将行和列值存储在两个向量中: [index_R, index_C] = ind2sub(*stuff*); 所以lengthindex_R=lengthindex_C
[index_R, index_C] = ind2sub(*stuff*);
所以lengthindex_R=lengthindex_Cfor i = 1:length(index_R)
image(index_R(i), index_C(i)) = [255 0 0];
end
我甚至还没有测试过。这是正确的吗?这是唯一的、更短、更优雅的配方吗
回应@Benoit的回答
正如我建议的那样,我试着调用imageindex\R,index\u C,1。然而,我在这里看到两个问题——如果我错了,请纠正我:
如果我的图像是,比如说,5000*5000,我想合法地高亮显示其中的1M像素,因为总计数是25M,imindex\u R,index\u C,1将返回一个1M*1M的矩阵,其中包含一些重复项,我猜,这对性能来说似乎相当糟糕。它是?
在我的测试中,这只适用于矩形区域。也就是说,如果你有一个圆,这将突出显示外正方形。
所以我提出了一个新的问题:我从ind2sub得到索引R,索引C。我应该改用线性指数吗?怎样这可能是一种突出显示我需要的像素的方法。先谢谢你
我尝试过的事情
我尝试了imlinear_索引,1=255,但我得到了
Maximum variable size allowed by the program is exceeded.
试着拆分它,比如说,imlinear_索引1:lengthlinear_索引/2,1=255,我的内存就用完了。真的卡住了
我还尝试了imlinear_index=255,它运行得非常快,只突出显示我需要的内容。但它只适用于红色通道。既然imlinear_指数2和imlinear_指数3给出了最大的变量大小误差,我怎么能得到蓝色和绿色呢
我的最终解决方案
考虑到线性指数也应该涵盖第二和第三个通道,我提出了
im(linear_indices) = 255 %Red
im(linear_indices+M*N) = 0 %green
im(linear_indices+2*M*N) = 0 %blue
如果您有更好的解决方案,请随意回答。您可以避免循环,使用简单的索引,如下所示:
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;
鉴于此:
如果在循环中发生这种情况,请尝试使用imgHandle=imshowhatever创建初始帧,而不是在循环中执行imshow或image,并在以下帧中执行setimgHandle、'CData',newFrameData。这种方法不会使“figure”窗口一直向前移动,而且速度更快。@user3528438如果您也能帮助我,我希望: