原文作者:aircraft

原文地址:https://www.cnblogs.com/DOMLX/p/8672489.html

 文中的一些图片以及思想很多都是参考https://www.cnblogs.com/My-code-z/p/5712524.html 大佬的思想 以及自己做一些个人理解的补充

  若想下载指静脉识别入门代码:https://github.com/lmskyle/process

  细化算法原理理解起来并不难,借助矩阵九宫格来实现。将九宫格定义并且编号成如下格式。

  在讲解之前有必要先看看书中是怎么说的:

  书中说的还是比较简洁的,毕竟是大牛写的,他们觉得很简单容易理解的东西,我们看起来就未必是这样了。好了闲话不多说 进入主题。

  第一步:为了不影响原图像的一些其他操作,先将原图像拷贝一份用来细化处理,在将细化后图片返回出去。

  第二步:就跟书里看的那样,需要满足四个条件来才能进行删除该点像素。这里进行的是沿着东南边界开始删除

      1: a. 2<= p2+p3+p4+p5+p6+p7+p8+p9<=6 

            大于等于2会保证p1点不是端点或孤立点,因为删除端点和孤立点是不合理的,小于等于6保证p1点是一个边界点,而不是一个内部点。等于0时候,周围没有等于1的像素,所以p1为孤立点,等于1的时候,周围只            有1个灰度等于1的像素,所以是端点(注:端点是周围有且只能有1个值为1的像素)。

          

       2:这里需要满足T(p1)=1  这里的T(p1)指的是以p2,p3...p8p9 就是p1邻居点进行轮转

          这里的轮转就是从p2开始不断的与后面的点进行组成元组的格式  比如(p2,p3)(p3,p4) (p4,p5)。。。(p9,p2) 看看这样组成的所有元组为(0,1)格式的是否恰好为1个

          假如为1个并且同时满足另外三个条件,那么他的样子大概会是这样的[[0,1,1]  这样轮转中就恰好有一个(0,1) 并且与1相邻的点必然还有像素值1 这样就是一个联通的区域 这时候p1就是边界点可以删除。

                                         [0,1,0]

                                         [0,0,0]]  

           大概的意思就是这样,我语文不好,不能说的很清楚,不过你们用本子画画就能理解我的意思了  见谅哈!!

       3:   P2*p4*p6 = 0

     4: p4*p6*p8 = 0

      这里 p4,p6出现了两次  在加上面的轮转判断 如果满足边界点条件 那么p4,p6中必然会有一个为0  至于为什么是p4,p6 就是因为这里是先沿着东南边界进行细化 

      将满足的点的索引值存入一个数组中,根据这个数组中点的索引值坐标  将图像中相应位置的点值置为0 完成一次边缘细化

  第三步:这里是沿着西北方向进行细化

      跟上面一步条件几乎一样,唯一改变就是第三和第四个条件,因为这里是为了沿着西北方向细化所以要调整为:p2*p4*p8 = 0    p2*p6*p8 = 0  这里的p2,p8出现两次的原因和 上面一步的p4,p6一样

       将满足的点的索引值存入一个数组中,根据这个数组中点的索引值坐标  将图像中相应位置的点值置为0 完成一次边缘细化

  最后:反复执行 第二步和第四步,不断的进行 左右的细化  直到没有点在可以细化  那么我们就得到了 细化后的骨架结构

现在原理已经解释完毕,那么就来看看python 是如何实现细化算法的

def neighbours(x,y,image):"Return 8-neighbours of image point P1(x,y)img = imagex_1, y_1, x1, y1 = x-1, y-1, x+1, y+1return [ img[x_1][y], img[x_1][y1], img[x][y1], img[x1][y1],     # P2,P3,P4,P5img[x1][y], img[x1][y_1], img[x][y_1], img[x_1][y_1] ]    # P6,P7,P8,P9def transitions(neighbours):n = neighbours + neighbours[0:1]      # P2, P3, ... , P8, P9, P2return sum( (n1, n2) == (0, 1) for n1, n2 in zip(n, n[1:]) )  # (P2,P3), (P3,P4), ... , (P8,P9), (P9,P2)
#将白色静脉区域细化成骨架结构  
def Refine(image):Image_Thinned = image.copy()  # deepcopy to protect the original imagechanging1 = changing2 = 1        #  the points to be removed (set as 0)while changing1 or changing2:   #  iterates until no further changes occur in the image# Step 1changing1 = []rows, columns = Image_Thinned.shape               # x for rows, y for columnsfor x in range(1, rows - 1):                     # No. of  rowsfor y in range(1, columns - 1):            # No. of columnsP2,P3,P4,P5,P6,P7,P8,P9 = n = neighbours(x, y, Image_Thinned)if (Image_Thinned[x][y] == 1     and    # Condition 0: Point P1 in the object regions 2 <= sum(n) <= 6   and    # Condition 1: 2<= N(P1) <= 6   The guarantee is not an isolated point and an endpoint or an internal pointtransitions(n) == 1 and    # Condition 2: S(P1)=1   (0,1)The number of rotation of the structure is 1, and the boundary point can be determined by adding other conditionsP2 * P4 * P6 == 0  and    # Condition 3  Remove the southeast boundary pointP4 * P6 * P8 == 0):         # Condition 4
                    changing1.append((x,y))for x, y in changing1: Image_Thinned[x][y] = 0# Step 2changing2 = []for x in range(1, rows - 1):for y in range(1, columns - 1):P2,P3,P4,P5,P6,P7,P8,P9 = n = neighbours(x, y, Image_Thinned)if (Image_Thinned[x][y] == 1   and        # Condition 02 <= sum(n) <= 6  and       # Condition 1transitions(n) == 1 and      # Condition 2P2 * P4 * P8 == 0 and       # Condition 3   remove the northwest border pointP2 * P6 * P8 == 0):            # Condition 4
                    changing2.append((x,y))    for x, y in changing2: Image_Thinned[x][y] = 0return Image_Thinned

虽然我英文很差,但是我有百度翻译啊 ,就将我所有的注释都翻译成了英文。

这里我指给出了算法的函数原型,至于怎么调用中间的代码我就不给了,反正如果你需要用到这个算法,只要将归一化到(0,1)二值的话图片传入进来调用就行了

在看看细化后的效果图

原图:

细化后的图片:

原图的静脉是黑色的  后面我在处理的时候 将黑白二值化翻转了  白色代表静脉区域

看完这些有兴趣还可以看看我这篇对指静脉预处理提取纹理的博客:http://www.cnblogs.com/DOMLX/p/8989836.html

总结归纳:

      1,看的出来这个细化算法还是有不足的,没有那么的美观,图像在分叉点处存在像素的冗余,即非单像素点,这会使得以后对特征点的提取相当的麻烦。

      这就需要对细化算法进行改进了,这里可以采用一些模板算子对图像进行除去。

      2,至于原手指静脉图像中的噪声和阴影等会在骨架图像中产生各种毛刺,这些毛刺也会影响后期的处理。除去毛刺可以通过从每个端点开始沿着费零点搜索,直到

        交叉点时停止。在这个过程中,记录下每个端点上遍历的点数,然后取一个阈值,将小于阈值的那个端点搜索路径上的置为0。这样就完成了对图像的裁剪。

有兴趣还可以看看:

http://www.cnblogs.com/DOMLX/p/8989836.html 提取纹理特征

http://www.cnblogs.com/DOMLX/p/8672489.html 指静脉细化算法

http://www.cnblogs.com/DOMLX/p/8111507.html 指静脉切割过程

指静脉识别:

https://www.cnblogs.com/DOMLX/p/9491972.html

转载于:https://www.cnblogs.com/DOMLX/p/8672489.html

手指静脉细化算法过程原理解析 以及python实现细化算法相关推荐

  1. 一致性哈希算法 mysql_一致性哈希算法 CARP 原理解析, 附 Golang 实现

    一致性哈希算法 CARP 原理解析, 附 Golang 实现 在后端服务开发的过程中, 遇到了这样一个问题: 需要在 mysql 前面部署 redis 做一层缓存, 要求 redis 是集群部署, 并 ...

  2. Web APi之过滤器执行过程原理解析【二】(十一)

    前言 上一节我们详细讲解了过滤器的创建过程以及粗略的介绍了五种过滤器,用此五种过滤器对实现对执行Action方法各个时期的拦截非常重要.这一节我们简单将讲述在Action方法上.控制器上.全局上以及授 ...

  3. java怎么sha散列算法_Java sha1散列算法的原理解析

    Java sha1散列算法的原理解析 发布时间:2020-10-31 00:01:59 来源:亿速云 阅读:101 作者:Leah 今天就跟大家聊聊有关Java sha1散列算法的原理解析,可能很多人 ...

  4. LDA主题模型原理解析与python实现

    本文转自:LDA主题模型原理解析与python实现_wind_blast的博客-CSDN博客   python实现: #-*- coding:utf-8 -*- import logging impo ...

  5. 短视频推荐算法过程分享,论如何针对推荐算法来优化短视频内容

    短视频推荐算法过程分享,论如何针对推荐算法来优化短视频内容 相信做短视频的小伙伴一定知道"短视频推荐算法",简单理解就是短视频平台都自有一套推荐机制,决定我们发布的短视频是否可以获 ...

  6. 手指静脉识别的工作原理

    手指静脉识别技术是一种新的生物特征识别技术,它利用手指内的静脉分布图像来进行身份识别. 工作原理,是依据人类手指中流动的血液可吸收特定波长的光线,而使用特定波长光线对手指进行照射,可得到手指静脉的清晰 ...

  7. Fisher线性判别分析原理解析及其Python程序实现两例

    一.Fisher线性判别分析原理解析与算法描述 Fisher:1890-1962, 英国数学家,生物学家,现代统计学奠基人之一,证明了孟德尔的遗传律符合达尔文的进化论. Fisher线性判别分析(Li ...

  8. Hough直线变换、圆变换原理解析与python实验

    霍夫变换 在图像x-y坐标中,经过点(x_i, y_i)的直线表示为y_i=k∗ x_i+b (1),其中k为斜率,b为截距 如果将x_i .y_i 看成常数,把k和b看成变量,式子(1)可以表示为b ...

  9. python logistic实例_logistic回归原理解析及Python应用实例

    logistic回归,又叫对数几率回归(从后文中便可此名由来).首先给大家强调一点,这是一个分类模型而不是一个回归模型!下文开始将从不同方面讲解logistic回归的原理,随后分别使用梯度上升算法和随 ...

最新文章

  1. 人脑如何模拟NLP?
  2. 一次搞懂所有排序算法(二)
  3. Windows 上连接本地 Linux虚拟机上的 mysql 数据库
  4. 那些年我用过的SAP IDE
  5. python数独解题器,Python中最短的数独求解器 – 它是如何工作的?
  6. 制作模板_年会邀请函制作免费模板
  7. Tableview中Dynamic Prototypes动态表的使用
  8. IPFS的相关操作命令
  9. HTML5 API详解(11):Cache 应用程序缓存,这下离线也可以玩了
  10. 开放世界下的混合域适应 ——面向真实自然场景下的全新迁移学习范式
  11. 在git提交时输错密码,怎么办?
  12. dpkg:处理 xxx (--configure)时出错解决办法,也可用于卸载软件出错的情况
  13. CherryTree:一款免费开源的富文本笔记软件
  14. 微信僵尸粉删除工具 WeTool v4.0.7.0 免费版
  15. 配电室环境监控系统技术方案
  16. c语言提供三种逻辑运算符,按优先级高低它们分别是,c语言逻辑运算符优先级
  17. 计算机基础与office应用教程,计算机基础与Office 2010实用教程
  18. ipad浏览器安装java_在桌面浏览器中调试iphone、ipad等设备上的网页
  19. 二体问题之6:轨道根数及其转化
  20. 微信小程序点击--实现带字母索引的城市列表

热门文章

  1. 微软总裁坦承微软曾错误地站在 Linux 的对立面
  2. 分享:写作赚钱的六个途径
  3. 如何让系统抗住双十一的预约抢购活动?
  4. JS监听复制、粘贴、剪贴
  5. Box2D-Lite源码阅读笔记(7)
  6. mac ppt 播放快捷键
  7. 【中国部分省市】离线地图可视化的json文件
  8. Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.
  9. 计算机2级怎么插u盘,从此不用U盘,教你怎么用普通网线连接2台电脑高速互传文件。...
  10. (十六) AIGC、AI绘画、SD-WebUI、本地部署、Stable-Diffusion本地模型、最新Controlnet扩展