我通常使用imcrop
来裁剪rectanguler图像,但我想创建圆形裁剪。怎么做?
我知道还有另外一个问题,这里是链接:
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)
的结果是带有白色背景的矩形
Cropping Circular region of interest around a point in MATLAB
roimaskcc
错误
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 :(得分: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);
它产生以下图像。
我希望这能澄清事情。可能有一种更好的方法来重新组合裁剪后的图像,但这是我能想到的。
答案 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
以及gif
或png
格式以透明背景保存图像。
以下是使用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);