61

我有一张图片,我想从中提取一个区域。我有这个区域的左上角和右下角的坐标。在灰度中,我这样做:

I = cv2.imread("lena.png")
I = cv2.cvtColor(I, cv2.COLOR_RGB2GRAY)
region = I[248:280,245:288]
tools.show_1_image_pylab(region)

我无法弄清楚如何在颜色上做到这一点。我想提取每个通道R,G,B;从每个通道中切出该区域并将它们重新合并在一起,但必须有更短的方法。

4

3 回答 3

147

OpenCV 和 Matplotlib 中的像素排序略有不同。

OpenCV 遵循 BGR 顺序,而 matplotlib 可能遵循 RGB 顺序。

因此,当您使用 pylab 函数显示在 OpenCV 中加载的图像时,您可能需要将其转换为 RGB 模式。(我不确定是否有任何简单的方法)。下面的方法演示它:

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

img = cv2.imread('messi4.jpg')
b,g,r = cv2.split(img)
img2 = cv2.merge([r,g,b])
plt.subplot(121);plt.imshow(img) # expects distorted color
plt.subplot(122);plt.imshow(img2) # expect true color
plt.show()

cv2.imshow('bgr image',img) # expects true color
cv2.imshow('rgb image',img2) # expects distorted color
cv2.waitKey(0)
cv2.destroyAllWindows()

注意:请查看下面@Amro 的评论以获得更好的 BGR 和 RGB 之间的转换方法。img2 = img[:,:,::-1]. 非常简单。

运行此代码并自己查看结果的差异。以下是我得到的:

使用 Matplotlib:

在此处输入图像描述

使用 OpenCV:

在此处输入图像描述

于 2013-02-25T19:21:15.583 回答
50

还有2个未提及的选项:

img[..., ::-1] # same as the mentioned img[:, :, ::-1] but slightly shorter

和多才多艺的

cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
于 2016-03-01T22:46:46.153 回答
0

最好的方法是使用:-
img2 = cv2.cvtColor(img , cv2.COLOR_BGR2RGB)

这会将 BGR 'img' 数组转换为 RGB 'img2' 数组。现在您可以将 img2 数组用于 matplotlib 的 imshow() 函数。

参考链接:- cvtColor

于 2020-05-26T17:34:27.660 回答