摘要
基本原理
光度立体通过分析物体表面对光照的反应,利用不同角度和方向的光源照射,获取物体表面的亮度信息。通过以下步骤实现三维重建:
- 光源设置:使用多个方向的光源照射同一物体。
- 图像捕捉:捕捉不同光照条件下的物体图像。
- 亮度计算:根据反射模型(如朗伯反射模型),计算各个点的亮度与法向量的关系。
- 法向量估计:通过分析亮度信息,估计物体表面的法向量。
- 三维重建:利用法向量信息重建物体的三维形状。

功能
- 三维重建:生成物体的高精度三维模型。
- 表面特征提取:提取物体表面的细节特征,如纹理和形状。
- 光照分析:分析物体表面对不同光照条件的反应,获取表面材质信息。
应用场景
- 计算机视觉:用于物体识别和追踪。
- 虚拟现实与增强现实:创建真实感强的三维模型。
- 工业检测:用于产品表面缺陷检测和质量控制。
- 医学成像:重建器官或组织的三维结构,用于手术规划。
基本步骤如下
1.加载图像
2.预处理
3.分割提取
4.识别
5.显示
代码
*1 加载图像
ImageFiles := []
ImageFiles[0] :='光度立体0.jpg'
ImageFiles[1] :='光度立体90.jpg'
ImageFiles[2] := '光度立体180.jpg'
ImageFiles[3] := '光度立体360.jpg'
dev_clear_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
* zoom_image_size (Image, ImageZoom, 512, 512, 'constant')
read_image (Image, ImageFiles)
rgb1_to_gray (Image, Image)
*2 设置参数
*光线投影和水平向右的夹角
* Tilts := [0,90,180,270]
*光线和光轴的夹角
* Slants := [45,45,45,45]
Tilts := [-80,10,95,-170]
Slants := [45,45,45,45]
*ResultType := ['gradient','albedo']
*梯度是提边
ResultType := ['gradient']
*3 光度立体重建
photometric_stereo (Image, HeightField, Gradient, Albedo, Slants, Tilts, 'gradient', 'poisson', [], [])
*求向量场导数
derivate_vector_field (Gradient, Result, 5, 'mean_curvature')
* threshold (Result, Regions, 0.001165, 0.1)
*4 提取特征
threshold (Result, Regions, 0, 0.9)
erosion_circle (Regions, RegionErosion1,5)
dilation_rectangle1 (RegionErosion1, RegionDilation1, 2, 50)
connection (RegionDilation1, ConnectedRegions2)
select_shape (ConnectedRegions2, SelectedRegions, ['area','height'], 'and', [47554.3,621.6], [1.12092e+006,662.36])
shape_trans (SelectedRegions, RegionTrans1, 'rectangle2')
area_center (RegionTrans1, Area, Row, Column)
orientation_region (RegionTrans1, Phi)
vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(180), HomMat2D)
affine_trans_region (RegionTrans1, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
*最好要光度立体后的图片
affine_trans_image (Result, ImageAffinTrans, HomMat2D, 'constant', 'false')
reduce_domain (ImageAffinTrans, RegionAffineTrans, ImageReduced1)
invert_image (ImageReduced1, ImageInvert)
*强制转换成灰度图像
scale_image_max (ImageInvert, ImageScaleMax)
threshold (ImageInvert, Regions1, -0.007587, -0.000266)
connection (Regions1, ConnectedRegions3)
dev_display (ImageAffinTrans)
dev_set_draw ('margin')
dev_display (ConnectedRegions3)
代码下载
更多详情了解
https://blog.youkuaiyun.com/qq_32015315/article/details/141663063