为我的图形创建一个圆形蒙版

时间:2013-08-28 11:43:52

标签: matlab mask

我正在绘制一个方形图像,但由于我的相机从圆形结构中查看,我希望图像看起来也是圆形的。所以要做到这一点,我只是想为图像创建一个掩码(基本上创建一个矩阵,并通过掩码将我的数据相乘,所以如果我想保留我的图像,我乘以一,如果我想要那个部分图像变为黑色,我乘以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循环

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

Here是一种可能的解决方案:

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);