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

使用OpenCV复制图像后无法将其在扩大的黑色画布中居中

修复方案

现有代码核心问题

  • 偏移量计算逻辑错误:你当前算的shift是画布高度的一半,正确的居中偏移应该是画布尺寸减去原图像尺寸的差值的一半,这样才能保证原图上下左右的黑边宽度一致
  • 像素赋值坐标错误:直接把原图像像素放到空画布的左上角对应位置,没有叠加偏移量
  • 存在冗余错误代码:emptyIm[i,j] = emptyIm[j,i] - image[int(shift)-1, int(shift1)-1]这行逻辑完全错误,会导致像素值异常,需要删除
  • 空画布数据类型未指定:默认创建的是float类型数组,和图像需要的uint8类型不匹配,容易出现显示异常

修正后可运行代码

import cv2
import numpy as np

# 读取图像
image = cv2.imread("cones11.png")
numRows = image.shape[0]  # 原图高度
numCols = image.shape[1]  # 原图宽度

# 放大系数
scalar = 1.2
# 计算新画布尺寸
new_h = int(scalar * numRows)
new_w = int(scalar * numCols)

# 计算居中偏移量(取整避免小数坐标)
offset_y = (new_h - numRows) // 2
offset_x = (new_w - numCols) // 2

# 创建uint8类型的黑色空白画布
emptyIm = np.zeros((new_h, new_w, 3), dtype=np.uint8)

# 像素赋值,叠加偏移量实现居中
for i in range(numRows):
    for j in range(numCols):
        emptyIm[offset_y + i, offset_x + j] = image[i, j]

# 也可以不用循环直接切片赋值,效率更高:
# emptyIm[offset_y:offset_y+numRows, offset_x:offset_x+numCols] = image

# 显示图像
cv2.imshow("original", image)
cv2.imshow("enlarged with border", emptyIm)
cv2.waitKey(0)
cv2.destroyAllWindows()

优化说明

直接用numpy切片赋值的方式可以替代双层for循环,运行效率会高很多,尤其处理大尺寸图像的时候优势明显。

内容的提问来源于stack exchange,提问作者Zach Bando

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:06:05