gpt4 book ai didi

matlab - 中心裁剪或填充帧内的图像

转载 作者:行者123 更新时间:2023-12-01 05:31:30 24 4
gpt4 key购买 nike

我的问题是关于一个很容易解决的问题,但我有兴趣学习这方面的最佳实践。
(名义上用于 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);

关于matlab - 中心裁剪或填充帧内的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10896943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com