纹理分割(二)GLMC学习

本文深入探讨了灰度共现矩阵(GLCM)的概念,包括其定义、框架、置换与归一化过程,以及如何通过GLCM计算纹理特征。重点介绍了GLCM在描述图像中灰度级空间依赖性的作用,以及如何通过矩阵框架解读不同空间关系下的共生矩阵。此外,文章还阐述了如何使矩阵对角对称以及将GLCM表述成概率的方法,为后续纹理分析奠定了基础。

一、什么是GLCM?

GLCM,是Grey Level Co-occurence Matrix的缩写,也叫做Grey Tone Spatial Dependency Matrix,中文名是灰度共现矩阵。

定义 The GLCM is a tabulation of how often different combinations of pixel brightness valus(gray level) occur in an image.GLCM是用来描述一幅图像中,灰度值的不同结合的频度。

下文要用到的测试图像如下图,这是一个灰度图(GLs),这张图也会贯穿整个教程。

定义 Order维数

这里描述的GLCM是用来表示纹理计算值的“二阶”序列。

First Order 一阶纹理特征是从原始图像值计算得到的统计结果,比如方差,但是不考虑相邻像素之间的关系。

Second Order 二阶纹理特征是考虑原始图像中,以两个像素(一般是相邻像素)构成的组之间的相互关系。

Third and Higer Order 三阶及更高维纹理(考虑三个甚至更多像素之间 的关系)是表示理论上的可能性,但是由于计算时间复杂度和解释复杂度,一般不应用。当然,这里有一种比较有效的方式去计算三维纹理的最新进展(200X):http://www.fp.ucalgary.ca/mhallbey/references.htm。

灰度直方图是一种描述单个像素灰度分布的一阶统计量;而灰度共现矩阵描述的则是具有某种空间位置关系的两个像素的联合分布,可以看成是两个像素灰度对的联合直方图,是一种二阶统计量。


GLCM的框架

两个像素之间的空间关系

GLCM特征表示在一个时间点上的两个像素之间的关系,一般称为reference参照和neighbor pixel相邻像素。在接下来的图示描述中,相邻像素是每一个参照像素的右侧像素。这可以简单的表示成(1,0)关系,像素1在x方向上,像素2在y方向上。

窗中的每一个像素都会依次成为参照像素,从左上角的像素开始,一直到右下角的像素结束。窗的右侧像素沿着边缘,没有右侧像素点,所以他们不在遵循此规则。

两个像素之间的分离度

本教程中所有的例子都是采用一个像素偏移量(一个参考像素和它的直接紧邻像素)。如果窗足够大,使用一个更大的偏移量可能更加完美。在计算理论上是没有任何区别的。应用GLCM建立的所有条目的总和(比如像素结合的次数)都将比给定的窗尺寸要小。

在测试图像中,灰度值的组合以及它们在矩阵中的位置。GLCM后续表征包含仅仅16个数据单元。

neighbor pixel value->
ref pixel value
0123
00,00,10,20,3
11,01,11,21,3
22,02,12,22,3
33,03,13,23,3

如何解读矩阵框架?

左上角的单元格表示的是(0,0)组合的次数,比如,在图像某区域内,灰度值0(相邻像素)掉入到右侧其他灰度值为0的像素(参考像素)的的次数。

不同的空间关系有不同的共生矩阵出现(上面,相邻,斜对角线上)。

例如:右侧(1,0)空间关系的矩阵框架


2210
0200
0031
0001

如何解读右(east)矩阵框架?

(不好翻译,直接英文自己理解)Twice in the test image the reference pixel is 0 and its eastern neighbour is also 0. Twice the reference pixel is 0 and its eastern neighbour is 1.Three times the reference pixel is 2 and its neighbour is also 2.


二、置换:使矩阵对角对称

纹理计算需要一个对角矩阵,因此下一步就是归一化GLCM。

一个对角矩阵意味着出现在单元内的相同值对称出现在对角线上。例如,在(3,2)单元内的值也会同样的出现在对角线(2,3)中。上面计算得到的东矩阵(east matrix)是不对称的。

东矩阵使用与之右相邻的像素计算各自的参照矩阵。如果仅仅使用一个方向,且按照这种方法计算完成,(2,3)的结合出现的次数与(3,2)的结合的次数是不一样的。(比如,3 may be to the right of 2 three times, but to the left of 2 only once)。但是,如果计算每一个像素对,就能实现对称:一次前向(forward)和一次后向(backwards)(第二次计算交换参照和相邻像素)。

例如:a reference pixel of 3 and its eastern neighbour of 2 would contribute one count to the matrix (3,2) and one count to the matrix element (2,3).对称也意味着,当考虑东相关(1,0),西相关(-1,0)也会被计算。这就叫做“水平矩阵”。


三、归一化:GLCM表述成概率

使GLCM对称以后,在计算纹理方法之前,仍然需要一步。这个方法需要的是每一个GLCM单元不是简单的计算,更多的是一种概率












<think>我们正在讨论Open3D进行三维表面重建。用户需要教程或示例代码。 根据Open3D的文档,常见的表面重建方法包括:泊松重建(Poisson reconstruction)、滚球法(Ball Pivoting)和Alpha Shapes等。 我们可以提供一个简单的示例流程,使用泊松重建方法。同时,用户可能需要安装Open3D,并准备点云数据。 步骤: 1. 读取点云数据(支持PLY, PCD, XYZ等格式) 2. 预处理点云(去噪、估计法线等) 3. 使用泊松重建进行表面重建 4. 保存重建的网格 注意:泊松重建需要点云具有法线信息。 示例代码: 我们将使用Open3D自带的示例点云数据(例如Eagle点云)进行演示。 由于用户可能需要从文件读取,这里同时展示从文件读取点云和从内置数据读取两种方式。 另外,根据引用[3]的内容,我们注意到用户可能需要处理多张照片(可能是通过摄影测量得到的点云),但这里我们专注于点云重建。 下面是一个示例代码:</think>以下是使用 Open3D 进行三维表面重建的教程和示例代码,涵盖主流算法实现: ### 一、核心重建方法及代码 #### 1. **泊松重建 (Poisson Reconstruction)** ```python import open3d as o3d # 读取点云 pcd = o3d.io.read_point_cloud("pointcloud.ply") # 预处理 pcd.estimate_normals() # 自动计算法线 pcd.orient_normals_consistent_tangent_plane(k=15) # 统一法线方向 # 泊松重建 mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson( pcd, depth=9, # 重建深度(控制细节精度) linear_fit=True ) # 保存结果 o3d.io.write_triangle_mesh("output_mesh.ply", mesh) ``` **关键参数说明**: - `depth`:值越大重建细节越丰富(建议 8-12) - `linear_fit`:启用线性插值优化曲面平滑度 #### 2. **滚球法 (Ball Pivoting)** ```python # 接续上一点云数据 radii = [0.005, 0.01, 0.02] # 滚球半径序列(从小到大) mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting( pcd, o3d.utility.DoubleVector(radii) ) ``` #### 3. **Alpha Shapes (凸包重建)** ```python alpha = 0.03 # 控制表面紧密度 mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape( pcd, alpha ) ``` ### 、完整处理流程 ```python import numpy as np # 1. 数据加载与预处理 pcd = o3d.io.read_point_cloud("input.pcd") pcd = pcd.voxel_down_sample(voxel_size=0.01) # 降采样 pcd.remove_statistical_outlier(nb_neighbors=20, std_ratio=2.0) # 离群点去除 # 2. 法线估计(泊松重建必需) pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid( radius=0.1, max_nn=30)) # 3. 表面重建 mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson( pcd, depth=10)[0] # 4. 后处理 mesh.remove_degenerate_triangles() # 移除退化三角形 mesh.remove_duplicated_triangles() mesh.remove_non_manifold_edges() # 修复非流形边 # 5. 保存结果 o3d.io.write_triangle_mesh("reconstructed_mesh.obj", mesh) ``` ### 三、可视化调试 ```python # 实时显示重建过程 o3d.visualization.draw_geometries([pcd], point_show_normal=True) # 查看法线 o3d.visualization.draw_geometries([mesh], mesh_show_wireframe=True) # 网格预览 ``` ### 四、参数优化建议 1. **法线计算**: - 搜索半径过小 → 噪声敏感 - 搜索半径过大 → 特征丢失 - 经验公式:$r = 2 \times \text{平均点距}$ 2. **泊松深度选择**: - 低细节物体:depth=8 - 高细节物体:depth=10-12 - 计算复杂度:$O(2^{\text{depth}})$ 3. **滚球半径规则**: $$ r_{\min} \approx 1.5 \times \text{点云平均间距} $$ $$ r_{\max} \approx 5 \times r_{\min} $$ ### 五、官方资源推荐 1. [📘 Open3D 表面重建文档](http://www.open3d.org/docs/latest/tutorial/geometry/surface_reconstruction.html) 2. [💻 GitHub 示例代码](https://github.com/isl-org/Open3D/tree/master/examples/python/reconstruction_system) 3. [🎥 视频教程:点云到网格实战](https://youtu.be/D7GLmC-3eB4) > 提示:大规模重建建议使用 GPU 加速,可通过 `mesh.cuda()` 启用 CUDA 支持(需编译 CUDA 版 Open3D)[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值