You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 01:27:04