3

我正在绘制一个方形图像,但由于我的相机视图是圆形结构,我希望图像看起来也是圆形的。所以要做到这一点,我只想为图像创建一个蒙版(基本上是创建一个矩阵,并将我的数据乘以蒙版,所以如果我想保留我的图像,我将乘以一,如果我想要那部分图像变黑,我乘以 0)。

我不确定制作代表圆形开口的矩阵的最佳方法。我只希望圆圈内的每个元素都是“1”,圆圈外的每个元素都是“0”,这样我就可以相应地为我的图像着色。我正在考虑做一个 for 循环,但我希望有一种更快的方法来做到这一点。所以......我需要的是:

  • 1280x720 的矩阵
  • 我需要一个直径为 720 的圆,以 1280x720 矩阵的中间为中心(我的意思是,对应于圆内的所有元素都有“1”,所有其他元素都有“0”

我的尝试

mask = zeros(1280,720)
for i = 1:1280
    for j = 1:720
        if i + j > 640 && i + j < 1360
            mask(i,j) = 1;
        end
    end
end

那么上面显然不起作用,我需要更好地看一下它以形成一个更好的方程来确定何时添加 1 = P 但理想情况下我不想使用 for 循环

谢谢,如果有什么不清楚的请告诉我!

4

2 回答 2

10

@kol 的答案看起来是正确的。您可以使用meshgrid函数通过矢量化代码执行此操作。

width = 1280;
height = 720;
radius = 360;
centerW = width/2;
centerH = height/2;
[W,H] = meshgrid(1:width,1:height);
mask = ((W-centerW).^2 + (H-centerH).^2) < radius^2;
于 2013-08-28T12:51:47.220 回答
1

是一个可能的解决方案:

width = 160;
height = 120;
mask = zeros(width, height);

center_x = width / 2;
center_y = height / 2;
radius = min(width, height) / 2;
radius2 = radius ^ 2;
for i = 1 : width
  for j = 1 : height
    dx = i - center_x;
    dy = j - center_y;
    dx2 = dx ^ 2;
    dy2 = dy ^ 2;
    mask(i, j) = dx2 + dy2 <= radius2;
  end;
end;

picture = randn(width, height); % test image :)
masked_image = picture .* mask;
imagesc(masked_image);
于 2013-08-28T12:03:40.053 回答