2013-02-25 2 views
33

У меня есть изображение, и я хочу извлечь из него область. У меня есть координаты левого верхнего угла и правого нижнего угла этой области. В шкале серого я делаю это так:Извлечение области из изображения с помощью нарезки в Python, OpenCV

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; срезая эту область с каждого из каналов и объединяя их вместе, но нужно быть более коротким способом.

+0

Это само по себе должно работать для цветного изображения также. –

+0

попробуйте, прежде чем преобразовывать изображение в оттенки серого –

+0

, также визуализируйте изображение, используя функцию cv2.imshow(). –

ответ

84

В OpenCV и Matplotlib существует небольшая разница в упорядочении по пикселям.

OpenCV следует по заказу BGR, в то время как matplotlib, вероятно, следует за заказом RGB.

Поэтому, когда вы показываете изображение, загруженное в OpenCV, используя функции pylab, вам может потребоваться преобразовать его в режим 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() 

NB: Пожалуйста, проверьте комментарий @Amro «s ниже для лучшего способа преобразования между BGR и RGB. img2 = img[:,:,::-1]. Очень просто.

Запустить этот код и сам увидеть его в результате. Ниже то, что я получил:

Использование Matplotlib:

enter image description here

Использование OpenCV:

enter image description here

+55

вы можете просто сделать: 'img2 = img [:,:, :: - 1]' перевернуть размер цвета от BGR до RGB (используя только индексирование NumPy) – Amro

+1

+1 - да, вы правы, и это будет быстрее чем мой ответ. Спасибо за комментарий. (Я просто хотел показать, что flipping r и b каналов специально.) –

+3

Другим способом достижения этого результата является использование 'cv2.cvtColor' с флагом' cv2.COLOR_BGR2RGB'. –

27

еще 2 варианта пока не упоминается:

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

и универсальный

cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
Смежные вопросы