pythonでgray16画像ファイルを読み込む方法

open3dでカラー画像と奥行き画像からポイントクラウドデータを作成する時に、RGB画像ファイルと16bitUINTグレー画像の読み込みが必要となる。
open3dには標準でこの読込み関数が定義されている。

import open3d as o3d
source_color = o3d.io.read_image("../../TestData/RGBD/color/00000.jpg")
source_depth = o3d.io.read_image("../../TestData/RGBD/depth/00000.png")

しかしながら

  • RGB画像ファイルはjpg

  • 奥行き画像は16bitグレーのpng

と限定されている。また、日本語のファイル名でエラーとなる。
pillowを使用し、次の様にすることで日本語ファイル名に対応して、更に16bitグレーのtiffファイルの読み込みも可能となる。

import open3d as o3d
from PIL import Image
fn1 = "../../TestData/RGBD/color/00000.jpg"
im = Image.open(fn1)
source_color = o3d.geometry.Image(np.asarray(im))  #open3d形式に変換
fn2 = "../../TestData/RGBD/depth/00000.png"
ima = Image.open(fn2)  #int32で読み込まれる
im = ima.convert("I;16")  #uint16に変換
source_depth = o3d.geometry.Image(np.asarray(im))  #open3d形式に変換

また、日本語ファイル名ではエラーとなるがopencvで読み込む時には次の様になる。

import open3d as o3d
import cv2
fn1 = "../../TestData/RGBD/color/00000.jpg"
source_color = o3d.geometry.Image(
    cv2.cvtColor(cv2.imread(fn1, -1), cv2.COLOR_BGR2RGB))
fn2 = "../../TestData/RGBD/depth/00000.png"
source_depth = o3d.geometry.Image(cv2.imread(fn2, -1))

opencvでは色の順番がBGRなので、ファイル読込後RGBへ変換している。 その後 以下のようにしてポイントクラウドを作り、表示する事が出来る。

rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(
    source_color , source_depth , convert_rgb_to_intensity = False)
cameraIntrinsic = o3d.camera.PinholeCameraIntrinsic(
    o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault)
pcd = o3d.geometry.PointCloud.create_from_rgbd_image(
    rgbd_image , cameraIntrinsic)
# Flip it, otherwise the pointcloud will be upside down
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
o3d.visualization.draw_geometries([pcd])  #表示

参考 redwood-data.org

http://redwood-data.org/