我正在尝试为我正在开发的 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/