2013-08-28 16 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