【问题标题】:Center crop or pad an image within a frame居中裁剪或填充框架内的图像
【发布时间】:2019-12-25 19:51:51
【问题描述】:

我的问题是关于一个很容易解决的问题,但我有兴趣学习最佳实践。 (名义上适用于 Matlab,但并非真正特定于语言)。

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

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

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

我确信这个问题已经被研究、解决和穷尽了,所以对于有一些图像处理经验的知识渊博的程序员来说,这应该不是一个很难的问题:)

【问题讨论】:

    标签: matlab image-processing


    【解决方案1】:

    这应该适用于比框架更小、相等和更大的灰度和彩色图像。试图保持它的可读性。

    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);
    

    【讨论】:

      猜你喜欢
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 2011-10-05
      • 1970-01-01
      • 2018-07-21
      相关资源
      最近更新 更多