Преобразование ColorSpaces с помощью OpenCv в Python

Как преобразовать изображение в цветовом пространстве BGRA в HSV и BGRA в YCbCR? Я знаю только преобразование из BGR, а не из BGRA. Подход разный или такой же?

hsv_image = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
ycrcb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2YCrCb)

Ваша помощь будет очень признательна.


person alyssaeliyah    schedule 28.03.2018    source источник
comment
Ни HSV, ни YCbCr не содержат плоскость прозрачности, поэтому вы просто удаляете ее и конвертируете оставшийся BGR, используя упомянутые вами методы.   -  person Dan Mašek    schedule 28.03.2018
comment
@DanMašek Вы отказываетесь от альфы с помощью cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR) или есть более простой / быстрый способ отказаться от дополнительного канала?   -  person Mark Setchell    schedule 28.03.2018
comment
@MarkSetchell cvtColor, вероятно, настолько хорош, насколько это возможно, если вы хотите полностью удалить плоскость - из-за макета это вопрос стирания (или не копирования) каждого 4-го байта. Однако, если я правильно читаю код, BGR2HSV будет работать и с 4-канальными входными изображениями, просто игнорируя альфа-плоскость. (Только что проверил это в интерпретаторе, да, тот же результат для BGR или BGRA, и содержимое альфа-плоскости не влияет на результат)   -  person Dan Mašek    schedule 28.03.2018


Ответы (1)


Ни HSV, ни YCbCr не включают в себя плоскость прозрачности, поэтому единственное, что может сделать с ней преобразование, — это игнорировать ее. Как оказалось (после небольшого изучения реализации), cvtColor принимает как 3-х, так и 4-канальные входные изображения для этих методов преобразования и корректно игнорирует 4-е (прозрачность), если оно присутствует.

Небольшой скрипт, чтобы убедиться, что:

import cv2
a = cv2.imread('car_1.png')
b = cv2.cvtColor(a, cv2.COLOR_BGR2BGRA)
c = b.copy()
c[:,:,3] = 0

aa = cv2.cvtColor(a, cv2.COLOR_BGR2HSV)
bb = cv2.cvtColor(b, cv2.COLOR_BGR2HSV)
cc = cv2.cvtColor(c, cv2.COLOR_BGR2HSV)

print (aa == bb).all()
print (aa == cc).all()

Печатает True и True.

То же самое для BGR -> YCrCb

person Dan Mašek    schedule 28.03.2018