OpenCV 在加载彩色图像时给出错误的颜色
- 2025-01-20 09:06:00
- admin 原创
- 136
问题描述:
我正在 Python OpenCV 中加载彩色图像并绘制该图像。但是,我得到的图像颜色全都混在一起了。
以下是代码:
import cv2
import numpy as np
from numpy import array, arange, uint8
from matplotlib import pyplot as plt
img = cv2.imread('lena_caption.png', cv2.IMREAD_COLOR)
bw_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
images = []
images.append(img)
images.append(bw_img)
titles = ['Original Image','BW Image']
for i in xrange(len(images)):
plt.subplot(1,2,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
以下是原始图片:
绘制的图像如下:
解决方案 1:
OpenCV 使用 BGR 作为图像的默认颜色顺序,而 matplotlib 使用 RGB。当您在 matplotlib 中显示使用 OpenCv 加载的图像时,通道将位于后面。
解决这个问题的最简单方法是使用 OpenCV 将其明确转换回 RGB,就像创建灰度图像时一样。
RGB_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
然后在你的情节中使用它。
解决方案 2:
作为上一个答案的替代,您可以使用(稍快一点)
img = cv2.imread('lena_caption.png')[...,::-1]
%timeit [cv2.cvtColor(cv2.imread(f), cv2.COLOR_BGR2RGB) for f in files]
每循环 231 毫秒 ± 3.08 毫秒(7 次运行的平均值 ± 标准差,每次 1 个循环)
%timeit [cv2.imread(f)[...,::-1] for f in files]
每循环 220 毫秒 ± 1.81 毫秒(7 次运行的平均值 ± 标准差,每次 1 个循环)
解决方案 3:
简单的单行解决方案
np.flip(img, axis=-1)
这可以双向转换。从 RGB 到 BGR,以及从 BGR 到 RGB。
解决方案 4:
如果您在暗黑模式下使用 PyCharm,您会发现从 BGR 更改为 RGB 是不够的。这是因为 PyCharm 有一个名为“反转暗黑主题的图像输出”的设置
禁用首选项 | 语言和框架 | Jupyter | 深色主题的反转图像输出应该会有所帮助
反转图像已打开:
反转图像已关闭:
请注意,两个示例中的代码相同。只有 PyCharm 中的设置不同。
解决方案 5:
读取图像后,通过从右到左读取矩阵将 bgr 矩阵的顺序还原为 rgb:
x = cv2.imread('./image.jpg')
x=x[:,:,::-1]
plt.imshow(x)
解决方案 6:
您可能还想尝试 cv2.IMREAD_UNCHANGED()。请参阅此处了解更多信息,了解它与 IMREAD_COLOR 的区别:
https://www.geeksforgeeks.org/python-opencv-cv2-imread-method/
解决方案 7:
如果您尝试使用 OpenCV 读取图像,它将默认使用 BGR。因此,您必须使用不同的方法来读取图像。我已对您的代码进行了必要的更改,以获得所需的输出,如下所示。
import cv2
import numpy as np
from numpy import array, arange, uint8
from matplotlib import pyplot as plt
img = cv2.cvtColor(cv2.imread('lena_caption.png'), cv2.COLOR_BGR2RGB)
bw_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
images = []
images.append(img)
images.append(bw_img)
titles = ['Original Image','BW Image']
for i in xrange(len(images)):
plt.subplot(1,2,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
输出:
扫码咨询,免费领取项目管理大礼包!