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

39
nl ja de
@Abid Rahman K Я пробовал это и вот эффект Цвета ошибочны. Я подозреваю, что это всего лишь один канал.
добавлено автор Booyaches, источник
@AbidRahmanK Вы правы! Меня смутил другой цвет. Спасибо за вашу помощь!
добавлено автор Booyaches, источник
Это также должно работать и для цветного изображения.
добавлено автор Abid Rahman K, источник
попробуйте его перед преобразованием изображения в оттенки серого
добавлено автор Abid Rahman K, источник
также визуализируйте изображение с помощью функции cv2.imshow ().
добавлено автор Abid Rahman K, источник
Я просто протестировал его. И у меня есть цветное изображение. Отображать изображение, используя функцию cv2.imshow (), а не любую функцию pylab или matplotlib, она просто отображается в другой цветовой карте.
добавлено автор Abid Rahman K, источник
И если вы сомневаетесь в этом, проверьте region.shape и убедитесь, что он имеет формат [rows, cols, 3] .
добавлено автор Abid Rahman K, источник
Возможно, вы могли бы использовать GetRectSubPix() , чтобы получить регион вместо нарезки.
добавлено автор martineau, источник

2 ответы

В 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 ниже для лучшего способа преобразования между BGR и RGB. img2 = img [:,:, :: - 1] . Очень просто.

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

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

enter image description here

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

enter image description here

94
добавлено
Другим способом достижения этого результата является использование cv2.cvtColor с флагом cv2.COLOR_BGR2RGB .
добавлено автор vahid abdi, источник
Как насчет этого? cv2.imshow = lambda _, y: plt.imshow (y [:,:, :: - 1]). figure
добавлено автор Hatshepsut, источник
вы можете просто сделать: img2 = img [:,:, :: - 1] , чтобы изменить размер цветов от BGR до RGB (используя только индексирование NumPy)
добавлено автор Amro, источник
+1 - Да, ты прав, и это будет быстрее моего ответа. Спасибо за комментарий. (Я просто хотел показать, что flipping r и b каналов конкретно.)
добавлено автор Abid Rahman K, источник
это img2 = img [::, :: - 1]
добавлено автор bluedroid, источник

Еще 2 варианта:

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

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

cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
32
добавлено
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community