2013-11-15 87 views
4

我通常使用imcrop裁剪矩形圖像,但我創建圓形裁剪。怎麼做?如何使用matlab做圓形作物?

我知道有另一quetion這一點,這裏的鏈接:

  1. MATLAB: how do I crop out a circle from an image

    [xx,yy] = ndgrid((1:imageSize(1))-ci(1),(1:imageSize(2))-ci(2)); 
    mask = (xx.^2 + yy.^2)<ci(3)^2; 
    

    imshow(mask)結果是長方形白色背景

  2. Cropping Circular region of interest around a point in MATLAB

    誤差在roimaskcc

  3. http://www.mathworks.com/matlabcentral/newsreader/view_thread/242489

    [xx,yy]=ndgrid(1:size(X,1), 1:size(X,2)); 
    CroppingMask= ((xx-Xcenter).^2+(yy-Ycenter).^2<=Radius^2); 
    X=X.*CroppingMask; 
    

    imshow(CroppingMask)結果是具有黑色背景白色的小圓形的矩形的中心的矩形。當我運行第3行時,它顯示一個錯誤。

請幫助我,一步一步因爲我是初學者。

這是我的形象:https://www.dropbox.com/s/5plqzqgyb1ej6gh/patricia.jpg。它的分辨率是480x640。

+0

你引用的第一個圓形面具問題給了我一個256x256圖像上的一個很好的圓圈,用於'ci = [100 100 20]'。 – chappjc

回答

6

解決方案(1)工作得很好。這是一個使用你的圖像的完整工作示例。

I = imread('patricia.jpg'); 
imageSize = size(I); 
ci = [250, 300, 100];  % center and radius of circle ([c_row, c_col, r]) 
[xx,yy] = ndgrid((1:imageSize(1))-ci(1),(1:imageSize(2))-ci(2)); 
mask = uint8((xx.^2 + yy.^2)<ci(3)^2); 
croppedImage = uint8(zeros(size(I))); 
croppedImage(:,:,1) = I(:,:,1).*mask; 
croppedImage(:,:,2) = I(:,:,2).*mask; 
croppedImage(:,:,3) = I(:,:,3).*mask; 
imshow(croppedImage); 

它產生下面的圖像。

croppedImage

我希望這個澄清的事情。重新組合裁剪後的圖像可能有更好的方法,但這是我可以從頭頂上想出來的。

+0

Thx爲您的回覆,但我得到這個錯誤,, 錯誤使用。* 整數只能與相同類或標量雙精度的整數相結合。 –

+0

解決 - 我使用這個http://www.mathworks.com/help/matlab/ref/double.html Thx先生,這是非常有益的.. –

+0

如何,如果我想清除黑色區域? –

0

我認爲,解決問題的方法是使用imcrop裁剪一個正方形,並使用下面的代碼覆蓋了一圈:

function imout = overlay_circle(im) 
u = size(im); 
mx = ceil(u(2)/2); 
my = ceil(u(1)/2); 
if (length(u)==3), 
    for x=1:u(2), 
     for y=1:u(1), 
      if (x-mx)^2 + (y-my)^2 > mx^2, 
       im(y,x,1) = 0; 
       im(y,x,2) = 0; 
       im(y,x,3) = 0; 
      end 
     end 
    end 
else, 
    for x=1:u(2), 
     for y=1:u(1), 
      if (x-mx)^2 + (y-my)^2 > mx^2, 
       im(y,x) = 0; 
      end 
     end 
    end 
end 
imout = im; 
+0

thx爲您的回覆, 我創建im變量,, im = imread('patricia.jpg'); 但是當我使用上面的代碼時,它顯示錯誤 錯誤:在此上下文中不允許使用函數定義。 –

+0

你可能需要在一個名爲overlay_circle.m的文件中定義函數 – carlosdc

1

你怎麼能指望最終的輸出看?根據MATLAB中的定義,你不能有一個「圓形」圖像 - 只是一個規則的圖像,其中圓外的所有點都設置爲某個背景值。不過,使用imwritegifpng格式可以將圖像保存爲透明背景。

下面是使用imroi方法的示例使用'Transparency',0集所有的黑色(0)像素以透明(需要圖像處理工具箱)

I = imread('cameraman.tif'); 
h = imshow(I); 

% define circular roi by square bounding box 
x = 10; 
y = 10; 
d1 = 100; 
d2 = 100; 
e = imellipse(gca, [x y d1 d2]); 

% roi can be interactively moved/adjusted 
% do not close figure window before createMask is called 

%%% these lines are only needed if you move or resize the roi 
    pos = getPosition(e); 
    x = pos(1); 
    y = pos(2); 
    d1 = pos(3); 
    d2 = pos(4); 
%%% 

BW = createMask(e,h); 
% here assuming your image is uint8 
BW = uint8(BW); 

I2 = I.*BW; % everything outside circle to black 
I2 = I2(x:(x+d1-1),y:(y+d2-1)); % close crop to circle 
imwrite('out.png',I2,'Transparency',0); 

在這種情況下。如果您感興趣的區域內有實際的黑色像素,它也會使這些像素變得透明。如果這可能是一個問題,則可以將BW裁剪爲與I2相同的尺寸,並設置'Alpha'而不是Transparency(有關詳細信息,請參閱imwrite文檔)。

2

以下是非交互式裁剪一個選項:

R=20; % radius in pixels 
x=10;y=10; %Location of upper-right corner of your cropping mask 

Mask = fspecial('disk',R)~=0; 
[u v i]=size(Mask); 

Cropped= imcrop(I,[x y u v]).*Mask; 
+0

我認爲'x + u'和'y + v'應該是'u'和'v'這裏 – FooBee

+0

@fuellee正確。相應編輯,謝謝。 –

-1
I = imread('patricia.jpg'); 
imageSize = size(I); 
ci = [250, 300, 100];  % center and radius of circle ([c_row, c_col, r]) 
[xx,yy] = ndgrid((1:imageSize(1))-ci(1),(1:imageSize(2))-ci(2)); 
mask = uint8((xx.^2 + yy.^2)<ci(3)^2); 
croppedImage = uint8(zeros(size(I))); 
croppedImage(:,:,1) = I(:,:,1).*mask; 
imshow(croppedImage); 
+0

你能解釋你的答案嗎?爲什麼你的答案比其他答案更好/不同? – m7913d