python 实现 gabor 滤波器提取纹理特征 提取指静脉纹理特征 指静脉切割代码

参考博客: https://blog.csdn.net/xue_wenyuan/article/details/51533953

https://blog.csdn.net/jinshengtao/article/details/17797641

傅里叶变换是一种信号处理中的有力工具, 可以帮助我们将图像从空域转换到频域, 并提取到空域上不易提取的特征. 但是经过傅里叶变换后,

图像在不同位置的频度特征往往混合在一起, 但是 Gabor 滤波器却可以抽取空间局部频度特征, 是一种有效的纹理检测工具.

在图像处理中, Gabor 函数是一个用于边缘提取的线性滤波器. Gabor 滤波器的频率和方向表达同人类视觉系统类似. 研究发现, Gabor 滤波器十分适合纹理表达和分离. 在空间域中, 一个二维 Gabor 滤波器是一个由正弦平面波调制的高斯核函数.

gabor 核函数的表达式:

复数表达式:

可以拆解: 实部:

虚部:

其中:

参数介绍:

方向(θ): 这个参数指定了 Gabor 函数并行条纹的方向, 它的取值为 0 到 360 度

波长(λ): 它的值以像素为单位指定, 通常大于等于 2. 但不能大于输入图像尺寸的五分之一.

相位偏移(φ): 它的取值范围为 - 180 度到 180 度. 其中, 0he180 度分别对应中心对称的 center-on 函数和 center-off 函数, 而 - 90 度和 90 度对应反对称函数.

长宽比 (γ): 空间纵横比, 决定了 Gabor 函数形状(support, 我翻译为形状) 的椭圆率(ellipticity). 当γ= 1 时, 形状是圆的. 当γ< 1 时, 形状随着平行条纹方向而拉长. 通常该值为 0.5

带宽(b):Gabor 滤波器的半响应空间频率带宽 b 和σ/ λ的比率有关, 其中σ表示 Gabor 函数的高斯因子的标准差, 如下:

σ的值不能直接设置, 它仅随着带宽 b 变化. 带宽值必须是正实数, 通常为 1, 此时, 标准差和波长的关系为:σ= 0.56 λ. 带宽越小, 标准差越大, Gabor 形状越大, 可见平行兴奋和抑制区条纹数量越多.

好介绍完毕.

现在进入主题, 我们提取纹理特征.

提取纹理特征, 还有增强纹理特征, 很多时候我们都是要先提取 ROI 感兴趣区域来进行操作的. 很多图片上的其他空间其实对我们没有什么太大的作用, 还影响程序的运行速度. 则我们只拿 ROI 区域进行纹理提取.

先看看原来的指静脉图片:

这图片区域很多, 一般我们只需要中间那部分指静脉纹理最多的 ROI 区域.

代码:#!/usr/bin/python

#coding:utf-8

importnumpyasnp

importos

importcv2

defpathFile(path):

returnos.getcwd()+'/'+path

defbrightestColumn(img):

w,h=img.shape

r=range(h/2,h-1)

c=range(0,w-1)

returnimg[c][:,r].sum(axis=0).argmax()

# 构建 GABOR 滤波器

defbuild_filters():

"""returns a list of kernels in several orientations"""

filters=[]

ksize=31#gaborl 尺度 这里是一个

forthetainnp.arange(0,np.pi,np.pi/4):#gaborl 方向 0 45 90 135 角度尺度的不同会导致滤波后图像不同

params={'ksize':(ksize,ksize),'sigma':3.3,'theta':theta,'lambd':18.3,

'gamma':4.5,'psi':0.89,'ktype':cv2.CV_32F}

#gamma 越大核函数图像越小, 条纹数不变, sigma 越大 条纹和图像都越大

#psi 这里接近 0 度以白条纹为中心, 180 度时以黑条纹为中心

#theta 代表条纹旋转角度

#lambd 为波长 波长越大 条纹越大

kern=cv2.getGaborKernel(**params)#创建内核

kern/=1.5*kern.sum()

filters.append((kern,params))

returnfilters

# 滤波过程

defprocess(img,filters):

"""returns the img filtered by the filter list"""

accum=np.zeros_like(img)#初始化 img 一样大小的矩阵

forkern,paramsinfilters:

fimg=cv2.filter2D(img,cv2.CV_8UC3,kern)#2D 滤波函数 kern 为其滤波模板

np.maximum(accum,fimg,accum)#参数 1 与参数 2 逐位比较 取大者存入参数 3 这里就是将纹理特征显化更加明显

returnaccum

# 获取感兴趣区域的 top 和 bottom 值 用于切割显示图像

defgetRoiHCut2(img,p0):

h,w=img.shape

maxTop=np.argmax(img[0:h/2,0])#在一定区域遍历选取指静脉边缘 具体高宽结合图像

minTop=np.argmax(img[0:h/2,w-1])

if(maxTop<65):

maxBottom=np.argmax(img[(13*h/16):40*h/48,0])+3*h/4

minBottom=np.argmax(img[(13*h/16):40*h/48,w-1])+3*h/4

else:

maxBottom=np.argmax(img[(3*h/4):h,0])+3*h/4

minBottom=np.argmax(img[(3*h/4):h,w-1])+3*h/4

maxTop=(2*maxTop+minTop)/3

maxBottom=(maxBottom+2*minBottom)/3

returnimg[maxTop:maxBottom,:]

# 获取感兴趣区域范围

defgetRoi(img):

height,width=img.shape

heightDist=height/4

w=img.copy()

w1=w[heightDist:3*heightDist,width/4:]

p0=brightestColumn(w1)+heightDist+height/2#将手指边缘的高度加上四分之三原始高度

pCol=w[:,p0:p0+1]

pColInv=pCol[::-1]

clahe=cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))#构建一个有限对比适应性直方图均衡化器

w1_2=clahe.apply(w[:,(p0/20):(p0+p0/2)])#截取区域宽度大概是 p0 高度的一点五倍 apply 是获取一个返回值 这里是为了方便参数的传递

w2=getRoiHCut2(w1_2,p0)

res = cv2.resize(w2, (270, 150), interpolation=cv2.INTER_CUBIC)returnclahe.apply(res)

deflogImg(img):

returnimg.astype(float)/255#将图像数据转为0-1存储

mDir=[]

imgs=[]

dbDir=os.getcwd()+"/db100/"

people=os.listdir(dbDir)

people.sort()

forpersoninpeople:

personDir=dbDir+person+"/"

hands=os.listdir(personDir)

forhandinhands:

handDir=personDir+hand+"/"

mDir+=[handDir]

mg=os.listdir(handDir)

mg.sort()

imgs=imgs+[handDir+s.split(".")[0]forsinmgifnots.split(".")[0]=="Thumbs"]

p0Imgs=[i.replace('db','gab_roi_db')foriinimgs]#p0Imgs 是每个文件的路径, mDir 是需要创建路径所有文件夹存放预处理后图片

mDir=[i.replace('db','gab_roi_db')foriinmDir]

# 判断路径是否存在 不存在就创建路径

forpathinmDir:

ifnotos.path.exists(path):

os.makedirs(path)

filters=build_filters()

forindex,imgPathinenumerate(imgs):

img=cv2.imread(imgPath+".bmp",0)

res0=process(getRoi(img),filters)#获取 ROI 进行直方图均衡化 切割后 在 gabor 滤波

cv2.imwrite(p0Imgs[index]+".png",res0)

printindex

cv2.waitKey(0)

cv2.destroyAllWindows()

好现在看看处理后的指静脉图片:

看起来还不错吧, 预处理之后就可以 进行纹理特征提取放入文件进行模式匹配啊 进行指静脉识别啊. 有兴趣的就期待在下之后的博客.

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/8989836.html

python图像纹理提取_python 实现 gabor 滤波器提取纹理特征 提取指静脉纹理特征 指静脉切割代码...相关推荐

  1. python实现gabor滤波器提取纹理特征 提取指静脉纹理特征

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8989836.html 参考博客:https://blog.csdn.net/xue_wenyu ...

  2. python图像去污_python图像去雾总结

    本人qq号:226607573,欢迎互相讨论的伙伴们 毕设期间对python图像去雾的学习与总结 近年来,雾霾越来越严重,导致户外获取的图像严重退化,何如将户外获取的有雾图像复原成高质量的清晰图像,已 ...

  3. python图像腐蚀处理_Python图像处理之膨胀与腐蚀的操作

    引言 膨胀与腐蚀是图像处理中两种最基本的形态学操作,膨胀将目标点融合到背景中,向外部扩展,腐蚀与膨胀意义相反,消除连通的边界,使边界向内收缩.在本文中我们将了解使用内核的图像膨胀与腐蚀的基本原理. 让 ...

  4. python统计图片的纹理信息_python实现LBP方法提取图像纹理特征实现分类

    题目描述 这篇博文是数字图像处理的大作业. 题目描述:给定40张不同风格的纹理图片,大小为512*512,要求将每张图片分为大小相同的9块,利用其中的5块作为训练集,剩余的4块作为测试集,构建适当的模 ...

  5. python opencv轮廓提取_Python + Opencv2 实现轮廓提取,轮廓区域面积计算

    对图像处理时,会遇到这样一个场景:找到图像主体轮廓,这是其一,可能为了凸显轮廓,需要用指定的颜色进行标记:轮廓标记完可能任务还没有结束,还需对轮廓所勾勒的像素面积区域统计计算. 本篇文章的主要内容就是 ...

  6. python图像倾斜校正_python 图像倾斜校正

    图像倾斜可以分为两种情况,一种是平面倾斜,这种情况下拍照设备与试卷平行,拍出来的图像只需要进行旋转即可完成矫正:另一种是Z轴倾斜,这种情况下拍照设备与试卷存在一定的角度,拍出来的图像要先进行透视变换, ...

  7. Python 图像 一样大小_Python图像处理,顺便生成一张海报

    海报是什么? 海报,是一种常见的宣传形式.通常包括活动的性质.主办单位.时间.地点等内容,多用于影视剧或新品宣传中,利用图片.文字.色彩.空间等要素进行完整的结合,以恰当的形式向人们展示出宣传信息. ...

  8. python收取wss数据_Python金融应用之提取交易日+合并截面数据

    NO.160 2020.07.15 工欲善其事,必先利其器 // - 前言 - ◆ ◆ ◆ ◆ 今天,小咖来讲讲如何利用Python提取最近交易日.前一周交易日.前一月交易日.前一季度交易日等,并提取 ...

  9. python批量读取文件名_python - 从路径中提取文件名,无论os / path形式如何

    python - 从路径中提取文件名,无论os / path形式如何 无论操作系统或路径格式是什么,我可以使用哪个Python库从路径中提取文件名? 例如,我想要所有这些路径返回c: a/b/c/ a ...

  10. python的应用图标_python实现根据图标提取分类应用程序实例

    本文实例讲述了python实现根据图标提取分类应用程序,分享给大家供大家参考. 具体方法如下: #!/usr/bin/python # -*- coding: utf-8 -*- import Ima ...

最新文章

  1. 解剖JavaScript中的null和undefined
  2. 串的堆分配存储c语言,数据结构c语言串的堆分配存储源程序
  3. Unable to load native-hadoop library for your platform... using builtin-java classes where applica
  4. C# string.Format谨慎使用
  5. servlet监听完成统计在线人数,显示在线人员列表(附源码)
  6. C语言经典面试题目(转的,不过写的的确好!)
  7. 关于c#调用c编译器
  8. MySQL子查询作为列_mysql 列子查询
  9. 苹果发布iOS 13.6.1更新,iPhone不会再变绿了
  10. 数字几何处理作业1:编程实现三角网格上高斯曲率和平均曲率的计算编程部分
  11. Docker学习笔记 1
  12. 考研日语线上笔记(五):中级日语语法总结20课(11~20)
  13. 历史上各大帝国面积排行榜
  14. 360木马云查杀结果(非常有讽刺意义)
  15. 游轮旅游是三亚旅游的未来
  16. 电脑开机启动项选择快捷键大全
  17. 7个等级 容灾等级_详细分析容灾备份的区别以及容灾的级别分类
  18. SEO网站优化步骤和技巧小结
  19. ARP局域网断网攻击原理分析及演示
  20. 小脚本之windows批量修改文件后缀名

热门文章

  1. html rfftq15.gif,stm32f4中用SD卡存储DCMI的图像
  2. Windows Server 无法启用 网络发现
  3. 图的遍历详解(广度优先和深度优先)
  4. Apache ShenYu(原 soul) 网关 整合 nacos
  5. FPS综述:植物次生代谢物与微生物组互作研究进展
  6. 记录第一次用阿里云(Windows主机)部署SSM项目(Spring+SpringMVC+Mybatis)
  7. 【机器学习算法】线性回归算法
  8. php手机页面中文输出乱码,如何解决php输出中文乱码的问题?
  9. wagtail 实现中英文
  10. linux 移动硬盘 mac,Mac下使用NTFS格式的移动硬盘