OpenCV通过填充调整

时间:2018-01-25 06:53:36

标签: python opencv image-processing

我正在尝试为我正在处理的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)而不改变宽高比?

1 个答案:

答案 0 :(得分: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,这会创建一个目标纵横比为黑色条形图像"填充"宽高比之间的差异。

示例(输入 - >输出)