如何使用matlab进行圆形裁剪?

时间:2013-11-15 01:53:49

标签: matlab image-processing

我通常使用imcrop来裁剪rectanguler图像,但我想创建圆形裁剪。怎么做?

我知道还有另外一个问题,这里是链接:

  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. 中的

    错误

  4. 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行时,它显示错误。

  5. 请一步一步帮助我,因为我是初学者。

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

5 个答案:

答案 0 :(得分:7)

解决方案(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

我希望这能澄清事情。可能有一种更好的方法来重新组合裁剪后的图像,但这是我能想到的。

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

答案 2 :(得分:1)

您如何期待最终输出?根据MATLAB中的定义,您不能拥有这样的“圆形”图像 - 只是一个常规图像,其中圆圈外的所有点都设置为某个背景值。但是,可以使用imwrite以及gifpng格式以透明背景保存图像。

以下是使用imroi方法的示例(需要图像处理工具箱)

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

在这种情况下,使用'Transparency',0将所有黑色(0)像素设置为透明。如果您感兴趣的区域内有实际的黑色像素,它也会使这些像素透明。如果这可能是一个问题,您可以将BW裁剪为与I2相同的尺寸,并设置'Alpha'而不是Transparency(有关详细信息,请参阅imwrite文档)。

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

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