2013-08-28 17 views
3

我正在绘制一个正方形图像,但是由于我的摄像机观察不到圆形构造,我希望图像看起来也是圆形的。所以要做到这一点,我只是想为图像创建一个蒙版(基本上是创建一个矩阵,然后用蒙版乘以我的数据,所以如果我想保留图像,我会乘以1,如果我想要那部分图像去黑色,我乘以0)。为我的图形创建圆形蒙版

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

  • 是为1280x720
  • 我需要有一个直径为720圈,在1280×720的矩阵的中间(中心矩阵我说的,这是所有对应于作为圆内元件具有一个“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循环

谢谢,让我知道如果什么都不清楚!

回答

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; 
+0

而获胜者是...... PeterM!除了半径应该是360而不是720之外,这个工作非常完美。此代码在kol's时花费了0.0271秒,而正确的花费了0.0763秒。因此,以这种方式快3倍,谢谢=) – spaderdabomb

+0

答案更新了正确的半径。 – PeterM

+0

+1尼斯解决方案! – kol

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

谢谢你的工作!我有兴趣看到别人有更快的解决方案,但现在+ 1 =) – spaderdabomb