【发布时间】: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)。但是,我在这里看到两个问题 - 如果我错了,请纠正我:
- 如果我的图像是 5000*5000,并且我想突出显示其中的 1M 像素(合法,因为总数为 25M),
im(index_R, index_C, 1)将返回一个 1M*1M 矩阵(我猜有一些重复),这似乎对性能很不利。是吗? - 在我的测试中,这只适用于矩形区域。即,如果您有一个圆圈,这将突出显示外部正方形。
所以我提出了一个新问题:我从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
如果您有更好的解决方案,请随时回答。
【问题讨论】: