5

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

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

  1. MATLAB:如何从图像中裁剪出一个圆圈

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

    结果imshow(mask)是白色背景的矩形

  2. 在 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。

4

5 回答 5

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

它产生以下图像。

裁剪图像

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

于 2013-11-15T13:56:56.807 回答
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;
于 2013-11-15T13:26:19.320 回答
1

您希望最终输出看起来如何?根据 MA​​TLAB 中的定义,您不能拥有这样的“圆形”图像 - 只是一个常规图像,其中圆外的所有点都设置为某个背景值。但是,可以使用或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);

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

于 2013-11-15T12:25:44.533 回答
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;
于 2013-11-15T02:08:49.577 回答
-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);
于 2017-07-08T04:24:52.283 回答