Как объединить 2 канала изображений оптического потока в оттенках серого JPG в одно изображение RGB в Python?

#python #python-3.x #opticalflow

#python #python-3.x #opticalflow

Вопрос:

Я создаю изображение RGB из заданных 2 изображений jpg в оттенках серого, которые предназначены для x, y канала в оптическом потоке соответственно.

пример входных изображений и мой текущий вывод

 def optical_flow(one, two, w, h):
    """
    method taken from (https://chatbotslife.com/autonomous-vehicle-speed-estimation-from-dashboard-cam-ca96c24120e4)
    """
    one_g = cv2.cvtColor(one, cv2.COLOR_RGB2GRAY)
    two_g = cv2.cvtColor(two, cv2.COLOR_RGB2GRAY)
    hsv = np.zeros((w, h, 3))
    # set saturation
    hsv[:,:,1] = cv2.cvtColor(two, cv2.COLOR_RGB2HSV)[:,:,1]
    # obtain dense optical flow paramters
    flow = cv2.calcOpticalFlowFarneback(one_g, two_g, flow=None,
                                        pyr_scale=0.5, levels=1, winsize=15,
                                        iterations=2,
                                        poly_n=5, poly_sigma=1.1, flags=0)
    # convert from cartesian to polar
    mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
    # hue corresponds to direction
    hsv[:,:,0] = ang * (180/ np.pi / 2)
    # value corresponds to magnitude
    hsv[:,:,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)
    # convert HSV to int32's
    hsv = np.asarray(hsv, dtype= np.float32)
    rgb_flow = cv2.cvtColor(hsv,cv2.COLOR_HSV2RGB)
    return rgb_flow 

imgu = cv2.imread('u.jpg')
imgv = cv2.imread('v.jpg')
img = optical_flow(one, two, w, h)

Image.fromarray(imgu, 'RGB').show() // top-left one in img
Image.fromarray(imgv, 'RGB').show() // top-right one in img
Image.fromarray(img, 'RGB').show()  // bottom-left one in img
  

Я думаю, что выходное изображение выглядит странно.

Ответ №1:

Оптический поток вычисляет векторное поле движения двух последовательных кадров. В вашем случае one и two . Однако ваши входные изображения u и v не показывают последовательные кадры. Проблема здесь в том, что между изображениями нет связи, т. Е. Нет похожего контента. Следовательно, ваше поле оптического потока flow будет иметь несколько случайных значений like.

При вычислении визуализации с цветовой кодировкой вашего поля оптического потока. В вашем случае канал насыщенности инициализирован неправильно:

 # set saturation
hsv[:,:,1] = cv2.cvtColor(two, cv2.COLOR_RGB2HSV)[:,:,1]
  

Установите его равным 255. Более распространенным решением является установка значения channel равным 255 и использование канала saturation для кодирования величины.