python - OpenCV 通过填充调整大小

标签 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)而不改变纵横比?

最佳答案

我能够根据以前的 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].
  • 然后,我减去图像的实际高度,以确定边框需要多大。
  • 最后,除以二(因为添加了上/下或左/右边框)并调用cv2.copyMakeBorder,这将创建一个具有目标宽高比并“填充”黑条的图像纵横比之间的差异。

示例(输入 -> 输出)

关于python - OpenCV 通过填充调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48437179/

相关文章:

c++ - 使用opencv从二进制图像中删除半曲面对象

python - 为列表中的每个项目分配特定的 ID,并生成具有重复 ID 的新列表

ios - OpenCV 2 框架是否可用于 armv6?

opencv - 将libsvm与OpenCV结合使用可预测类

python - 使用 Python Pillow(或 PIL)增加 JPG 上的 PNG mask 区域

ios - 如何处理不同设备上的图像大小

python - scipy.spatial.distance.squareform 的反函数

python - 如何使用 Selenium 和 Python 绕过 Google 验证码?

python - Windows 8.1 上使用 Django 的 manage.py runserver 出错

c++ - 使用图像作为另一个掩码