Matlab:将与遮罩中的非零相对应的像素值强制设为NaN

时间:2018-11-01 12:04:02

标签: matlab image-processing nan

我正在尝试使用half5修复等不同方法来校正部分完成的RGB图像(如inpaint_nans,p31m图像拼贴的右半部分)中的边缘伪影。因为边缘的位置在分析上是已知的,所以我首先使用insertShape outmask_h绘制了一个大小相同的灰色蒙版。现在,我想强制将与outmask_h的非零像素相对应的从Half5到NaN的像素获取inpaint_nans所需的NaN,因此我尝试了

[r,c] = find(outmask_h);                                                
for i = 1:length(r); half5(r(i),c(i)) = NaN; end

我首先认为这是可以的,因为写入结果显示黑色像素的遮罩不为零,但是inpaint_nans之后的结果与之前相同,并且对其中一个通道的NaN计数为0,所以这是错误的(为什么?)。

相反的策略(生成NaN数组并替换零像素)似乎很有效,但速度太慢

half5n = NaN(size(half5,1), size(half5,2), 3);
[r,c] = find(outmask_h==0);
for i = 1:length(r); half5n(r(i),c(i)) = half5(r(i),c(i)); end

1 个答案:

答案 0 :(得分:3)

您可以将outmask_h数组用作logical索引(确保首先是logical),然后将其应用于图像的每个通道,然后再传递给{{1} }。

此外,如注释中所指出,请确保您的输入矩阵为inpaint_nans,否则分配具有double值的赋值将导致NaN

0

如果您想将非零值设为half5 = double(half5); mask = logical(outmask_h); new = zeros(size(half5)); for k = 1:size(half5, 3) channel = half5(:, :, k); channel(mask) = NaN; new(:,:,k) = inpaint_nans(channel); end ,则可以使用NaN的反数

outmask_h