我的问题是关于一个很容易解决的问题,但我有兴趣学习这方面的最佳实践。 (名义上是Matlab,但不是特定语言)。
我正在加载任意大小的图像,我需要在预定义大小的黑色图像中使其适合(不进行任何缩放或不改变宽高比)(让我们称之为帧)。 加载的图像可以在任一维度或两个维度中小于,等于或大于预定义的帧。
如果图像小于帧,我希望用零填充(周围会有黑色边框),直到帧大小,并居中。 如果它更大,我想以中心的方式裁剪它。
理想情况下,我不想对任一维度中的像素数的奇偶校验做出任何假设 - 也就是说,加载的图像和帧都可以具有两个维度的奇数或偶数像素数。肯定会有一些四舍五入的事情要做。
我确信这个问题已经被研究,解决和用尽了,所以对于具有图像处理经验的知识渊博的程序员来说,这不应该是一个非常难的问题:)
答案 0 :(得分: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);