読者です 読者をやめる 読者になる 読者になる

理科系の備忘録

Linux/Ubuntu/Mac/Emacs/Computer vision/Robotics

視差画像とV-disparity

背景

ステレオ視差画像から平面を抽出する一つの手法として、視差画像をV-disparity画像に変換するというものがある。
今回は視差画像からV-disparity画像への変換の練習をしてみる。

結果

試みに視差画像のy方向にノイズを加えてみた。その結果がV-disparity画像に現れている。
V-disparity画像、U-disparity画像のそれぞれにオブジェクトが可視化された。

次回はここから直線を抽出して、平面抽出(と物体抽出)をしてみたい。

コードは以下。

V-disparity画像

V-disparity画像とは、視差画像における画像平面上下方向の視差の出現頻度を表した画像である。
実装に沿って表現すると、縦軸が画像と共通(V)で横軸が視差(disparity)からなる画像で、
各画素が「あるVでのある視差値の出現回数」を表している。
同様に、横軸を画像と共通(U)にして縦軸を視差(disparity)としたものをU-disparity画像と呼ぶ。

#!/usr/bin/env python2
#-*- coding: utf-8 -*-

import cv2
import numpy as np
from numpy.random import *

# 視差画像に物体を描画する関数
def draw_object(img, x, y, w=50, h=100):
    color = img[y, x]
    img[y-h:y, x-w//2:x+w//2] = color


# 視差画像の作成
height = 480
width = 640
max_disp = 200
img = np.zeros(( height, width), np.uint8)
for y in range(height)[::-1]:
        img[y, ...] = int(float(y) / height * max_disp) + abs(normal(0,5))


# 視差画像に物体をセット
draw_object(img, 275, 175, w=20, h=50)
draw_object(img, 300, 200, w=20, h=50)
draw_object(img, 300, 300, w=50, h=50)
draw_object(img, 300, 400, w=300, h=50)
draw_object(img, 100, 150, w=20, h=50)

# V-disparity
vhist_vis = np.zeros((height, max_disp), np.float)
for i in range(height):
    vhist_vis[i, ...] = cv2.calcHist(images=[img[i, ...]], channels=[0], mask=None, histSize=[max_disp], ranges=[0, max_disp]).flatten() / float(height)

vhist_vis = np.array(vhist_vis * 255, np.uint8)
vblack_mask = vhist_vis < 5
vhist_vis = cv2.applyColorMap(vhist_vis, cv2.COLORMAP_JET)
vhist_vis[vblack_mask] = 0

# U-disparity
uhist_vis = np.zeros((max_disp, width), np.float)
for i in range(width):
    uhist_vis[..., i] = cv2.calcHist(images=[img[..., i]], channels=[0], mask=None, histSize=[max_disp], ranges=[0, max_disp]).flatten() / float(width)
    
uhist_vis = np.array(uhist_vis * 255, np.uint8)
ublack_mask = uhist_vis < 5
uhist_vis = cv2.applyColorMap(uhist_vis, cv2.COLORMAP_JET)
uhist_vis[ublack_mask] = 0


# 保存
img = cv2.applyColorMap(img, cv2.COLORMAP_JET)
cv2.imwrite('disparity.png', img)
cv2.imwrite('v_disparity.png', vhist_vis)
cv2.imwrite('u_disparity.png', uhist_vis)