我想我在这里真的错过了什么。
我有一个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)
。但是,我在这里看到两个问题 - 如果我错了,请纠正我:
im(index_R, index_C, 1)
将返回1M * 1M矩阵(有一些重复,我猜),这对性能来说似乎很糟糕。是吗?所以我提出了一个新问题:我从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
如果您有更好的解决方案,请随时回答。
答案 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)
输出:
如果您只想要红色像素(纯粹的饱和红色,我猜:)和其他任何内容,请将其他2个通道值设置为0:
Im(index_R,index_C,2:3) = 0;
给予: