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
相关产品推荐
相关产品推荐

