【问题标题】:Change origin of image coordinate system to bottom left instead of default top left将图像坐标系的原点更改为左下角而不是默认的左上角
【发布时间】:2017-09-20 22:06:09
【问题描述】:

有没有一种简单的方法可以将OpenCV的图像坐标系原点更改为左下角?例如使用numpy?我正在使用 OpenCv 2.4.12 和 Python 2.7。

相关:Numpy flipped coordinate system,但这里只讨论显示。我想要一些我可以在我的算法中始终如一地使用的东西。

更新:

def imread(*args, **kwargs):
    img = plt.imread(*args, **kwargs)
    img = np.flipud(img)
    return img      
#read reference image using cv2.imread
imref=cv2.imread('D:\\users\\gayathri\\all\\new\\CoilA\\Resized_Results\\coilA_1.png',-1)
cv2.circle(imref, (0,0),30,(0,0,255),2,8,0)
cv2.imshow('imref',imref)

#read the same image using imread function
im=imread('D:\\users\\gayathri\\all\\new\\CoilA\\Resized_Results\\coilA_1.png',-1)
img= im.copy()
cv2.circle(img, (0,0),30,(0,0,255),2,8,0)
cv2.imshow('img',img)

使用 cv2.imread 读取图像:

使用 imread 函数翻转图像:

如图所示,圆在原始图像和翻转图像的左上角原点处绘制。但是图像看起来翻转了,这是我不希望的。

【问题讨论】:

  • 只需在 OpenCV 调用后更改 y 的值,除非您打算自己更改 OpenCV 源代码,这可能工作量太大。
  • @ZdaR 我认为 OpenCV 以左上角为原点。
  • numpy.flip(img, axis=0)numpy.flpud(img) 怎么样(假设img 是图像数组)?
  • 如果 OP 可以有效地沿 x 轴翻转矩阵会怎样?这将是一次性操作,并且考虑到操作成本不高,可以达到目的吗?
  • 我没有发现问题。底部图像按照原始问题的要求翻转?!相对于原始图像,您的圆圈位于左下角。如果要以原始方向显示图像,则在调用imshow之前翻转:def imshow(name, array): return cv.imshow(name, np.flipud(array))

标签: python-2.7 opencv matplotlib


【解决方案1】:

反转高度(或列)像素会得到下面的结果。

import numpy as np
import cv2
import matplotlib.pyplot as plt
%matplotlib inline 

img = cv2.imread('./imagesStackoverflow/flip_body.png') # read as color image
flip = img[::-1,:,:] # revise height in (height, width, channel)

plt.imshow(img[:,:,::-1]), plt.title('original'), plt.show()
plt.imshow(flip[:,:,::-1]), plt.title('flip vertical'), plt.show()
plt.imshow(img[:,:,::-1]), plt.title('original with inverted y-axis'), plt.gca().invert_yaxis(), plt.show()
plt.imshow(flip[:,:,::-1]), plt.title('flip vertical with inverted y-axis'), plt.gca().invert_yaxis(), plt.show()

输出图像:

上面包括了你打算做的那个?

【讨论】:

  • 我从上面在 cmets 中建议的 @Paul 得到了结果。我只是希望原点位于左下角。但是图像看起来就像原始图像一样。
  • 与我回复中的“垂直翻转,y 轴倒置”图像相同?即最后一张图片。
  • 是的。你能解释一下这里发生了什么吗?你翻转图像然后反转y轴?我对吗?如果我听起来有点愚蠢,我很抱歉,但这如何使原点位于左下方?谢谢你的回答!
  • @lost_inthesis 当然可以。首先,OpenCV 读取由(height(0:n), width(0:m), channel(B,G,R) 组成的彩色图像。如果只是通过反转height 来垂直翻转它,即。 y 轴的img[::-1,:,:]0 仍然从左上角开始。因此,反转 y 轴 plt.gca().invert_yaxis() 将再次翻转图像并使 y 轴的 0 从左下角开始。
  • @lost_inthesis btw, img[:,:,::-1] in plt.imshow() 用于将颜色通道反转为OpenCV 将彩色图像读取为BGR 而不是RGB
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
相关资源
最近更新 更多