在对MATLAB中的图像应用像stdfilt(i, ones(5, 5))
这样的滑动窗口操作后,我想将边界像素(使用填充计算的像素)设置为NaN
,以将它们标记为无意义。在此示例中,我将最外面的两行和每列设置为NaN
。给定M * M窗口,如何将此边界(M-1)/ 2像素宽设置为特定值?
答案 0 :(得分:3)
假设r
是矩阵(stdfilt
的结果)。以下是如何将NaN分配给边框的示例。
通常,您需要指定正确的索引。
>> r = rand(4)
r =
0.8147 0.6324 0.9575 0.9572
0.9058 0.0975 0.9649 0.4854
0.1270 0.2785 0.1576 0.8003
0.9134 0.5469 0.9706 0.1419
>> r([1, end], :) = nan
r =
NaN NaN NaN NaN
0.9058 0.0975 0.9649 0.4854
0.1270 0.2785 0.1576 0.8003
NaN NaN NaN NaN
>> r(:, [1, end]) = nan
r =
NaN NaN NaN NaN
NaN 0.0975 0.9649 NaN
NaN 0.2785 0.1576 NaN
NaN NaN NaN NaN
更新:一般情况下,由于图片是矩阵,您的问题是“如何设置某些矩阵值?”。答案是:“使用矩阵的索引”。有很多方法可以做到这一点(例如,通过构建索引矩阵,逻辑掩码或使用行/列坐标)。决定使用什么方法通常取决于此特定任务的操作速度。例如,如果您需要用NaN替换零,则使用逻辑掩码会更快:r(r == 0) = nan
,依此类推。
答案 1 :(得分:0)
首先找到矩阵中NaN
的位置。假设您的图像名称为A.
a = isnan(A);
这将创建matric a
,在数字位置为0,在NaN
位置为1。然后找到Nan
元素的位置:
[x,y]=find(a==1);
然后将值V
替换为:
for i=1:length(x)
A(x(i),y(i)) = V;
end
答案 2 :(得分:0)
这将完成这项工作,但这似乎是图像处理工具箱中的那种功能。
mask = logical(ones(size(i)));
width = (m - 1) / 2;
mask(width + 1:size(i, 1) - width, width + 1:size(i, 2) - width) = 0;
i(mask) = NaN;