使用Python,OpenCV中的切片从图像中提取区域

时间:2013-02-25 17:26:21

标签: python opencv image-processing

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

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;从每个通道切割这个区域并将它们合并在一起但是必须有一个更短的方法。

3 个答案:

答案 0 :(得分:114)

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:

enter image description here

使用OpenCV:

enter image description here

答案 1 :(得分:40)

还有2个未提及的选项:

HttpSession

和多才多艺的

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

答案 2 :(得分:0)

执行此操作的最佳方法是使用:-
img2 = cv2.cvtColor(img , cv2.COLOR_BGR2RGB)

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

引用链接:-cvtColor