对一幅图像进行中心裁剪或填充图像

问题描述 投票:3回答:2

我的问题是一个非常容易解决的问题,但是我有兴趣学习有关此问题的最佳实践。(对于Matlab来说是名义上的,但不是特定于语言的)。

我正在加载任意大小的图像,我需要使其(不进行任何缩放或改变宽高比)适合预定义大小的黑色图像(我们将其称为框架)。在一个或两个维度上,加载的图像可以小于,等于或大于预定义的帧。

如果图像小于框架,我希望将其填充为零(周围会有黑色边框),直到框架大小并居中。如果更大,我想以居中的方式裁剪。

理想情况下,我不想对任何一个维度上的像素数目的奇偶性做出任何假设-也就是说,加载的图像和帧在两个维度上都可以具有奇数或偶数像素数目。当然会有一些四舍五入。

我确信这个问题已经过研究,解决和排除,因此对于具有图像处理经验的博学的程序员来说,这不是一个很难的问题:]

matlab image-processing
2个回答
0
投票

这适用于比框架小的,相等和更大的灰度图像和彩色图像。试图使其保持可读性。

frameWidth = 800;
frameHeight = 600;
imagepath = 'smaller.jpg'; % 'equal.jpg', 'larger.jpg'

img = im2double(imread(imagepath));
[imgHeight, imgWidth, channels] = size(img);
frame = zeros(frameHeight, frameWidth, channels);

dImageWidth = round((frameWidth - imgWidth)/2);
dImageHeight = round((frameHeight - imgHeight)/2);

unEqualHeight = (imgHeight ~= frameHeight);
unEqualWidth = (imgWidth ~= frameWidth);

if imgHeight <= frameHeight
    frameVStart = max(1, dImageHeight);
    frameVEnd = min(frameHeight, frameHeight-dImageHeight-unEqualHeight);
    imgVStart = 1;
    imgVEnd = imgHeight;
else
    frameVStart = 1;
    frameVEnd = frameHeight; 
    imgVStart = max(1, -dImageHeight);
    imgVEnd = min(imgHeight, imgHeight+dImageHeight);
end

if imgWidth <= frameWidth
    frameHStart = max(1, dImageWidth);
    frameHEnd = min(frameWidth, frameWidth-dImageWidth-unEqualWidth);
    imgHStart = 1;
    imgHEnd = imgWidth;
else
    frameHStart = 1;
    frameHEnd = frameWidth; 
    imgHStart = max(1, -dImageWidth);
    imgHEnd = min(imgWidth, imgWidth+dImageWidth);
end

frame(frameVStart:frameVEnd, frameHStart:frameHEnd, :) = ...
    img(imgVStart:imgVEnd, imgHStart:imgHEnd, :);

imshow(frame);

0
投票

我尝试运行程序,但出现错误。(无法执行分配,因为左侧的尺寸为600 x 800 x 3,右侧的尺寸是601×801×3。),如何解决此问题?不知道它说什么...也许有人可以帮助我

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.