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

Python中OpenCV图像Y轴反转(原点移至左下)且保留图像的实现问询

解决方案:OpenCV坐标原点从左上角转左下角(不翻转图像)

核心思路是只做坐标映射,不修改图像像素数据——因为你不需要翻转图像,只是需要把Y轴的计数方向反过来。具体操作基于图像高度做反向计算:

1. 基础坐标转换公式

假设用OpenCV读取的图像为img,图像高度为h = img.shape[0],宽度为w = img.shape[1]:

  • OpenCV原生坐标:原点在左上角,Y轴从上到下递增,范围0 ≤ y < h,X轴从左到右递增,范围0 ≤ x < w
  • 目标坐标:原点在左下角,Y轴从下到上递增,范围0 ≤ y' < h,X轴不变

两者的转换关系为:

# 从目标坐标(y', x')转OpenCV原生坐标(y, x)
y = h - 1 - y'
x = x'

# 从OpenCV原生坐标(y, x)转目标坐标(y', x')
y_prime = h - 1 - y
x_prime = x

2. 读取目标坐标对应的像素

如果你需要获取目标坐标(y', x')处的像素颜色,直接用转换后的原生坐标索引即可:

import cv2

img = cv2.imread("sprite_sheet.png")
h, w = img.shape[:2]

# 目标坐标(0, 0)对应图像左下角像素
target_y, target_x = 0, 0
opencv_y = h - 1 - target_y
opencv_x = target_x
pixel_color = img[opencv_y, opencv_x]

# 输出BGR格式的颜色值(OpenCV默认BGR)
print(pixel_color)

3. 精灵轮廓的坐标转换

当你用cv2.findContours提取精灵的轮廓后,得到的轮廓点是OpenCV原生坐标,只需批量转换每个点的Y值即可:

# 假设已经裁剪出单个精灵图像sprite_img
sprite_h, sprite_w = sprite_img.shape[:2]
contours, _ = cv2.findContours(sprite_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 转换轮廓点到左下角原点坐标
converted_contours = []
for cnt in contours:
    converted_cnt = []
    for (x, y) in cnt:
        # 转换单个点的Y坐标
        y_prime = sprite_h - 1 - y
        converted_cnt.append((x, y_prime))
    converted_contours.append(converted_cnt)

4. 精灵表中单个精灵的局部坐标转换

如果是从整张精灵表中裁剪单个精灵,比如精灵在表中的左上角原生坐标为(sheet_y_start, sheet_x_start),高度为sprite_h,宽度为sprite_w:

  • 精灵内部的原生坐标范围:sheet_y_start ≤ y < sheet_y_start + sprite_h,sheet_x_start ≤ x < sheet_x_start + sprite_w
  • 转换为精灵自身的左下角原点坐标:
# 精灵内部原生坐标(y, x)转局部目标坐标(y', x')
y_prime = sprite_h - 1 - (y - sheet_y_start)
x_prime = x - sheet_x_start

这种方式完全基于坐标计算,不需要对图像做翻转或修改,既保留了OpenCV读取像素的高效性,又满足了你对原点位置的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:42:23