cv2.imdecode(Python OpenCV)出现颜色错误。

6

我尝试显示位于这里的图片:http://skyservice.pha.jhu.edu/DR12/ImgCutout/getjpeg.aspx?ra=118.70299999999999&dec=45.721000000000004&width=10&height=10&scale=0.6

图片如下所示:

enter image description here

我使用这段代码:
import matplotlib.pyplot as plt
import numpy as np
import urllib
import cv2

url = 'http://skyservice.pha.jhu.edu/DR12/ImgCutout/getjpeg.aspx?ra=118.70299999999999&dec=45.721000000000004&width=10&height=10&scale=0.6'

def url_to_image(url):
    resp = urllib.request.urlopen(url)
    image = np.asarray(bytearray(resp.read()), dtype="uint8")
    image = cv2.imdecode(image, cv2.IMREAD_COLOR)
    return image

img = url_to_image(url)
plt.imshow(img)

它显示如下内容:

enter image description here

在这里所有的颜色都太蓝了。我尝试了各种可能性来改变`cv2.IMREAD_COLOR`,使用手册、StackOverflow或其他网络上找到的值,如-1、0、1、`cv2.COLOR_BGR2RGB`等,但是我还没有能够得到正确的颜色。我尝试了`cv2.COLOR_BGR2GRAY`,甚至没有显示为灰度。我甚至尝试了this answer,但是`cv2.CV_LOAD_IMAGE_COLOR`似乎已经不存在了...
是否有一个正确的`cv2.imdecode()`标志值,或者`plt.imshow()`的特殊颜色映射,可以给我初始的颜色呢?

2
matplotlib 需要 RGB 排序,而 OpenCV (非常反常地) 使用 BGR。我认为你需要使用 cv2.cvtColor() 在两个之间进行转换。 - Mark Setchell
太好了!我之前不知道这个!谢谢,伙计。它有效。我现在会回复并感谢你的答案。 :) - Matt
1个回答

16

多亏了Mark Setchell,现在它有效了。我引用他的话:

matplotlib需要RGB顺序,而OpenCV(反常地)使用BGR

因此,正确的代码是

def url_to_image(url):
    resp = urllib.request.urlopen(url)
    image = np.asarray(bytearray(resp.read()), dtype="uint8")
    imageBGR = cv2.imdecode(image, cv2.IMREAD_COLOR)
    imageRGB = cv2.cvtColor(imageBGR , cv2.COLOR_BGR2RGB)
    return image

有趣!我猜这只是影响显示,如果我使用 BGR 训练模型,不会有任何区别,对吧? - Vimos
我想不会。但是如果你想使用OpenCV正确地显示它,请注意颜色编码。 :) - Matt
如果你用RGB图像来训练一个神经网络,然后给它BGR图像,那么你肯定会得到更差的准确性;同样的,如果你用BGR图像来训练一个神经网络,然后给它RGB图像,结果也是如此。 - Arthur Tacca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接