一种简单的GPU三维图像分割算法
来源:互联网 发布:ubuntu usb hdd 编辑:程序博客网 时间:2024/05/30 04:39
转自:http://gpgpu.org.cn/cuda/a-simple-gpu-based-three-dimensional-image-segmentation-algorithm
图像分割的定义是将整幅图像区域分割成各自互不交叉的小区域。图像分割的算法有很多,教科书上讲到一些经典的分割算法,包括阈值法、区域生长法、分裂与合并算法、边界跟踪与连接算法、分水岭算法,这些算法适合提取出灰度比较一致的各个区域;此外还有纹理分割算法,严格说来,与其称之为纹理分割还不如称之为纹理检测与分类,通过提取纹理特征,如:Laws特征、梯度共生矩阵特征、分形特征,得到每一个点或小邻域的特征向量,然后利用特征向量将每个点分到不同的纹理类中去。
有些扯远了,还是回到三维图像分割上来,由于三维图像的数据量是巨大的,暂不考虑复杂的纹理特征,我们仅仅希望有在GPU上实现一种并行的快速算法,能够自动标记出三维数据中所有灰度比较一致的各个连通区域。我们先看看教科书上的方法,阈值法不能提取多个灰度不一致的区域,区域生长不容易做到每个区域种子点自动选取,分裂与合并的逻辑稍显复杂且分割的区域边缘会出现锯齿,边界跟踪与连接在三维上根本没办法实现,分水岭又是串行递归的-_-!!!
假设已经是有了一幅二值图,我们就可以用连通区标记的算法,为二值图中的每一个小的区域标上不同的标号,这就是常用的二值图CCL(Connected Component Labeling)算法,可以扫描填充法、FloodFill等方式来具体实现这个算法。算法的原理是,判断当前点的邻域内有没有和当前点取值相同的点,如果有,就把他们标记为相同的标号。利用这个思想,如果在判断的时候,不是判断当前点的邻域内有没有和当前点取值相同的点,而是判断当前点的邻域内有没有和当前点取值相近的点——有点类似于梯度区域生长算法,就可以设计出适用于灰度图像的灰度连通区标记算法灰度图CCL算法,如果对每一个点进行如上判断,就可以预先生成一幅具有二值图,且对每个点的判断不依赖于其它点判断的结果,可以做到完全并行。这一段代码很简单,假设体数据已经做了去噪处理,然后用For循环遍历每一个点就能搞定(对于Cuda实现,就是把最里层的内容写到kernel里面),贴代码:
这里考虑了每个像素的26邻域,可以按需要改造成根据18邻域(除去立方体角上的像素)或者6邻域(只考虑前后左右上下6个像素)判断;如果是Z方向的尺度于XY方向不一致,可以修改对Z方向邻域像素判断时所用的阈值。
下一步,就是三维的二值图CCL算法了,暂时没有想好怎样在GPU上实现这段代码,如果采用FloodFill这个很串行的算法,就没有放到GPU上实现的必要了。直接上三维FloodFill代码:更多点击
- 一种简单的GPU三维图像分割算法
- K-means算法进行简单的图像"语义"分割,java
- 一种新颖的图像分割方法
- 简单的彩色图像分割
- caffe GPU版本使用fcn分割自己的图像
- 图像处理之图像分割之Snake算法简单梳理
- matlab分割三棱柱(简单的三维作图)
- 图像算法研究---一种简单的YUV转RGB的优化算法
- 图像算法研究---一种简单的YUV转RGB的优化算法(2)
- 图像算法研究——一种简单的YUV转RGB的优化算法(2)
- 基于GPU的光源空间平行分割阴影图算法
- ITK SNAP打开三维图像分割结果
- 简单介绍图像分割的方法
- 图像分割--金字塔分割算法
- 遗传算法与图像的多层次分割
- 基于热映像的图像分割算法
- 有关图像分割算法的几个网站
- 图像分割 1.基于阈值的算法
- 10个你未必知道的CSS技巧
- 人生的十个不要等
- 不要迷失在技术的海洋中
- 什么叫bootloader? |what's bootloader?
- SRAM
- 一种简单的GPU三维图像分割算法
- 关于有条件的掩藏DBGridEh某一单元格的值,在HideDuplicates的基础上加上相应条件的构思
- 李彦宏:成功者是时刻播种梦想的人
- SDRAM
- ASP.net 2.0 C#判断文件夹与文件是否存在
- 新买了相机,嘿嘿
- ORACLE中判别字符串是不是字母数字型的
- 爱恨情仇——Kobe悖论终结篇
- 大学生应掌握的电子知识