我的问题是一个非常容易解决的问题,但是我有兴趣学习有关此问题的最佳实践。(对于Matlab来说是名义上的,但不是特定于语言的)。
我正在加载任意大小的图像,我需要使其(不进行任何缩放或改变宽高比)适合预定义大小的黑色图像(我们将其称为框架)。在一个或两个维度上,加载的图像可以小于,等于或大于预定义的帧。
如果图像小于框架,我希望将其填充为零(周围会有黑色边框),直到框架大小并居中。如果更大,我想以居中的方式裁剪。
理想情况下,我不想对任何一个维度上的像素数目的奇偶性做出任何假设-也就是说,加载的图像和帧在两个维度上都可以具有奇数或偶数像素数目。当然会有一些四舍五入。
我确信这个问题已经过研究,解决和排除,因此对于具有图像处理经验的博学的程序员来说,这不是一个很难的问题:]
这适用于比框架小的,相等和更大的灰度图像和彩色图像。试图使其保持可读性。
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);
我尝试运行程序,但出现错误。(无法执行分配,因为左侧的尺寸为600 x 800 x 3,右侧的尺寸是601×801×3。),如何解决此问题?不知道它说什么...也许有人可以帮助我
谢谢