Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 从行/列索引更新RGB图像值_Matlab_Image Processing - Fatal编程技术网

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

Matlab 从行/列索引更新RGB图像值,matlab,image-processing,Matlab,Image Processing,我想我真的错过了一些东西。 我有一个RGB图像作为M*N*3矩阵。我在这张图片中找到了一些我想变成的区域,比如说,纯饱和红色。我的区域来自bwconncomp和其他东西;我已将行和列值存储在两个向量中: [index_R, index_C] = ind2sub(*stuff*); 所以lengthindex_R=lengthindex_C

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

[index_R, index_C] = ind2sub(*stuff*);
所以lengthindex_R=lengthindex_C 我唯一能做的就是:

for 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如果您也能帮助我,我希望: