使用OpenCV填充图像时如何保留原有像素值,仅填充区域为0值?
问题修复方案
核心原因
你调用cv2.copyMakeBorder()时使用cv2.BORDER_CONSTANT填充模式,但没有指定value参数,部分OpenCV版本在未传入填充值时,会出现原图像素也被覆盖为0的异常情况。
另外手动计算填充像素容易出错,推荐动态计算填充值适配两张图的尺寸,避免后续尺寸不匹配的问题。
修复代码
方案1:动态计算填充尺寸(推荐)
自动计算上下左右需要填充的像素,实现原图居中填充,和im0尺寸对齐:
# 读取两张图的高、宽 h0, w0 = im0.shape[:2] h1, w1 = im1.shape[:2] # 计算各边填充像素数 top_pad = (h0 - h1) // 2 bottom_pad = h0 - h1 - top_pad left_pad = (w0 - w1) // 2 right_pad = w0 - w1 - left_pad # 执行填充,指定填充值为黑色(0,0,0) im1_padded = cv2.copyMakeBorder( im1, top=top_pad, bottom=bottom_pad, left=left_pad, right=right_pad, borderType=cv2.BORDER_CONSTANT, value=(0, 0, 0) )
方案2:沿用你原有填充参数
如果你确定要使用top=200、bottom=95、left=100、right=95的填充规则,仅需要补充value参数即可:
im1 = cv2.copyMakeBorder( im1, top=200, bottom=95, left=100, right=95, borderType=cv2.BORDER_CONSTANT, value=(0,0,0) )
验证方法
你可以通过切片打印原图区域的像素值确认效果:
# 方案1验证 print(im1_padded[top_pad:top_pad+h1, left_pad:left_pad+w1]) # 方案2验证 print(im1[200:200+217, 100:100+317])
输出即可看到你原本的图像像素,其他填充区域全为0。
内容的提问来源于stack exchange,提问作者Skarl001
相关产品推荐
相关产品推荐

