【问题标题】:OpenCV Resize by FillingOpenCV 通过填充调整大小
【发布时间】:2018-01-25 06:53:35
【问题描述】:

我正在尝试为我正在开发的 Python/OpenCV 应用程序执行一些图像预处理。我有一个非常简单的函数,它从文件中加载图像,并将其调整为特定大小:

def get_im(path):
    img = cv2.imread(path, cv2.IMREAD_COLOR)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img = cv2.resize(img, (IMG_ROW, IMG_COL))
    img = np.array(img)
    img = img.astype('float32')
    img /= 255
    return img

虽然这会调整我的图像大小,但它会改变图像的纵横比。如何(最好使用 OpenCV)在不改变纵横比的情况下缩放图像以适应特定大小(IMG_ROW、IMG_COL)?

【问题讨论】:

标签: python opencv image-processing


【解决方案1】:

我能够根据以前的 C++ 解决方案找到解决方案:

# Resize
border_v = 0
border_h = 0
if (IMG_COL/IMG_ROW) >= (img.shape[0]/img.shape[1]):
    border_v = int((((IMG_COL/IMG_ROW)*img.shape[1])-img.shape[0])/2)
else:
    border_h = int((((IMG_ROW/IMG_COL)*img.shape[0])-img.shape[1])/2)
img = cv2.copyMakeBorder(img, border_v, border_v, border_h, border_h, cv2.BORDER_CONSTANT, 0)
img = cv2.resize(img, (IMG_ROW, IMG_COL))

这是怎么回事:

  • 比较输入图像与目标图像的纵横比,以确定是否应使用 if 语句在垂直 (v) 轴或水平 (h) 轴上添加边框。
  • (以垂直情况为例),我使用公式(IMG_COL/IMG_ROW)*img.shape[1]计算具有与目标图像相同纵横比但宽度等于输入图像的图像的高度。
  • 然后我减去图像的实际高度以确定边框需要多大。
  • 最后,除以 2(因为添加了顶部/底部或左侧/右侧的边框)并调用 cv2.copyMakeBorder,这将创建一个具有目标纵横比的图像,并用黑条“填充”纵横比之间的差异。

示例(输入 -> 输出)

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 2012-08-14
    • 2022-01-09
    • 2011-01-03
    • 2020-01-29
    • 2016-09-29
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多