先来写付费专栏的第一个项目吧。

在说这个题目之前,先说一下这个项目的总体思路,如下所示。

我们的目的是遇到问题,解决问题。

  1. 那么首先我们看一下我们的问题是什么吧?(发现问题\color{green}发现问题发现问题)

利用Gabor象限特征实现掌纹识别,从网上找到Gabor变换代码,进行象限特征提取和掌纹匹配(分别计算同一个掌纹和不同掌纹的相似度)

  1. 拿到这个问题,我们首先抓住文章的关键词,
    我找到的关键词如下:(分析问题\color{green}分析问题分析问题)
    Gabor,象限特征掌纹,识别象限特征提取,掌纹匹配\color{red}{Gabor,象限特征}\color{pink}{掌纹,识别}\color{blue}{象限特征提取,掌纹匹配}Gabor,象限特征掌纹,识别象限特征提取,掌纹匹配

  2. 接下来呢,我们理清一下思路:(提取/总结问题\color{green}提取/总结问题提取/总结问题)
    题目的要求就是1.进行特征提取,2.将提取的特征进行匹配,查看相似度

  3. 然后呢,我们就要借助搜索引擎了,现在的所有引擎就是基于关键词搜索,我们可以提炼一下关键词,比如Gabor象限特征\color{red}{Gabor象限特征 }Gabor象限特征 Python\color{red}{Python}Python,关键词之间要加空格。第一个关键词Gabor象限特征是要查找的代码类型,第二个关键词Python是说明要用什么代码实现,具体操作如下图所示。

  4. 除了标题之外,查看文章摘要,来了解文章是否是自己需要的。

  5. 然后我们就点一下符合我们要求的文章,详细查阅。这里我们先点开第一个文章看一下。通过题目感觉到跟我们的题目要求比较吻合。我们再往下细看。

  6. 他首先说了一下他的运行环境,如下图

    而我的运行环境是Ubuntu18.04TLS,默认Python版本是3.74,没关系,我们可以在Terminal中创建一个虚拟环境,命令格式conda create -n xxx python=3.6,xxx为环境名。具体操作如下图。因为我们看到的博客上面说的需要的python2的环境,所以我的创建命令行语句是conda create -n gabor python==2.7.4,效果如下图所示。(可以不用指定的环境,比如python2你可以用python3代替,只需要把对应的python2代码换成python3就可以\color{red}{可以不用指定的环境,比如python2你可以用python3代替,只需要把对应的python2代码换成python3就可以}可以不用指定的环境,比如python2你可以用python3代替,只需要把对应的python2代码换成python3就可以)

    出现如下字样,说明配置环境成功

  7. 进一步的,我们需要进入环境,命令为conda activate xxx,xxx为环境名称,这里我们是刚才创建的gabor

    可以看到绿色部分表示环境已经从base 变成gabor了。红色部分则是激活环境的实际代码。
    接下来继续配置环境,OpenCV版本为2.4.7,在gabor环境下输入命令行为pip install opencv-python
    然后我们就开始书写我们的代码
    第一步引入库函数

import cv2 #导入opencv函数库
import numpy as np #引入提供维度数据与矩阵运算的,支持数组运算的数学函数库numpy
import pylab as pl #引入pylab,即可以画图又可以计算,可以交互使用
  1. 在Ubuntu下在指定的虚拟环境中用Pycharm创建一个py文件,如果不会在在虚拟环境中创建文件,请参考链接,例如gabor.py,在文件中添加函数库引入。如下图所示。

    编译器没有报错,说明导入函数库成功。
  2. 构建Gabor滤波器
import cv2
import numpy as np
import pylab as pldef build_filters():filters = []ksize = [7,9,11,13,15,17] #gabor尺度,6个lamda = np.pi/2.0 #波长for  theta in np.arange(0,np.pi,np.pi / 4): #gabor方向,0 45,90,135共四个for K in range(6):kern = cv2.getGaborKernel((ksize[K],ksize[K]),1.0,theta,lamda,0.5,0,ktype=cv2.CV_32F)kern /= 1.5*kern.sum()filters.append(kern)return filters


11. 创建滤波过程

def process(img,filters):accum = np.zeros_like(img)for kern in filters:fimg = cv2.filter2D(img,cv2.CV_8UC3,kern)np.maximum(accum,fimg,accum)return accum


12. 特征图提取并显示

#Gabor特征提取
def getGabor(img,filters):res = [] #滤波结果for i in range(len(filters)):res1 = process(img,filters[i])res.append(np.asarray(res1))pl.figure(2)for temp in range(len(res)):pl.subplot(4,6,temp+1)pl.imshow(res[temp],cmap='gray')pl.show()return res
  1. 然后再加入我写的图片读入函数,就可以获得图片效果了。
if __name__ == '__main__':path = "/home/philtell/Downloads/bmp600"  # 待读取的文件夹path_list = os.listdir(path)path_list.sort()  # 对读取的路径进行排序filters = build_filters()for filename in path_list[-1:]:print(filename)img_path = os.path.join(path, filename)image = cv2.imread(img_path)getGabor(image, filters)

原图如下:

效果图如下:

再找一张原图:

特征效果如下图


下来就来对提取的特征进行匹配,

  1. 先对提取的特征进行标准化,我们写一下标准化函数,主要是每一个元素除以最大的元素
#数据归一化
def normalization(data):return data / np.max(abs(data))
  1. 计算特征之间的相似度,也就是汉明距离
def getSimilarityDistance(feature1,feature2):diff = 0  x1 = np.array(feature1).flatten() #将特征抹平,多维矩阵变成一维数组,逐个对比,计算相似度x2 = np.array(feature2).flatten()for bit1,bit2 in zip(x1,x2):if bit1 != bit2:diff += 1print(diff)similarity = 1 - diff/len(x1)print('相似度',similarity)diff = 0print(len(x1))for bit1,bit2 in zip(x1,x1):if bit1 != bit2:diff += 1print(diff)similarity = 1 - diff/len(x1)print(diff)similarity = 1 - diff/len(x1)print('相似度',similarity)
  1. 主函数为:
if __name__ == '__main__':path = "/home/philtell/Downloads/bmp600"  # 待读取的文件夹filters = build_filters() #构建滤波器img_path = os.path.join(path, '061_5.bmp') #获得图片地址img_path2 = os.path.join(path, '062_5.bmp')image = cv2.imread(img_path)  #将图片转化为多维数组image2 = cv2.imread(img_path2)result = getGabor(image, filters)result2 = getGabor(image2, filters)features = normalization(np.array(result)) #归一化图片特征features2 = normalization(np.array(result2))getSimilarityDistance(features,features2) #计算不同图片和相同图片之间相似度

效果如下:

不同图片相似度为 0.60,相同图片相似度为1.0

最后将全部代码上传:

import cv2
import numpy as np
import pylab as pl
import osdef build_filters():filters = []ksize = [7,9,11,13,15,17] #gabor尺度,6个lamda = np.pi/2.0 #波长for theta in np.arange(0,np.pi,np.pi / 4): #gabor方向,0 45,90,135共四个for K in range(6):kern = cv2.getGaborKernel((ksize[K],ksize[K]),1.0,theta,lamda,0.5,0,ktype=cv2.CV_32F)kern /= 1.5*kern.sum()filters.append(kern)print("np.arange(0,np.pi,np.pi / 4)",np.arange(0,np.pi,np.pi / 4))print("np.pi",np.pi)print("len",len(filters))return filtersdef process(img,filters):accum = np.zeros_like(img)for kern in filters:fimg = cv2.filter2D(img,cv2.CV_8UC3,kern)np.maximum(accum,fimg,accum)return accum#Gabor特征提取
def getGabor(img,filters):print('len(filters)',len(filters))res = [] #滤波结果for i in range(len(filters)):res1 = process(img,filters[i])res.append(np.asarray(res1))pl.figure(2)for temp in range(len(res)):pl.subplot(4,6,temp+1)pl.imshow(res[temp],cmap='gray')pl.show()return res#数据归一化
def normalization(data):return data / np.max(abs(data))def getSimilarityDistance(feature1,feature2):diff = 0x1 = np.array(feature1).flatten() #将特征抹平,多维矩阵变成一维数组,逐个对比,计算相似度x2 = np.array(feature2).flatten()for bit1,bit2 in zip(x1,x2):if bit1 != bit2:diff += 1print(diff)similarity = 1 - diff/len(x1)print('相似度',similarity)diff = 0print(len(x1))for bit1,bit2 in zip(x1,x1):if bit1 != bit2:diff += 1print(diff)similarity = 1 - diff/len(x1)print(diff)similarity = 1 - diff/len(x1)print('相似度',similarity)if __name__ == '__main__':path = "/home/philtell/Downloads/bmp600"  # 待读取的文件夹path_list = os.listdir(path)path_list.sort()  # 对读取的路径进行排序filters = build_filters()img_path = os.path.join(path, '061_5.bmp')img_path2 = os.path.join(path, '062_5.bmp')image = cv2.imread(img_path)image2 = cv2.imread(img_path2)print('image',type(image))result = getGabor(image, filters)result2 = getGabor(image2, filters)features = normalization(np.array(result))features2 = normalization(np.array(result2))getSimilarityDistance(features,features2)

如果你能看到我这句话,那么说明你是订阅了专栏,感谢你的订阅~

编程小白的人工智能路之Gabor滤波提取掌纹特征并对比掌纹相似度(一)相关推荐

  1. 编程小白的第一本python入门书-《编程小白的第一本Python入门书》读书笔记

    对于编程零基础初学者来讲,Python入门选择看什么样的书是很重要的.第一本Python入门书的内容要精简,不然新手学了很久,都还在死磕基础知识.书的难度也不能太高,不然缺乏基础的学习者会看不懂,从而 ...

  2. 爬虫python需要什么软件-python的爬虫流程是什么?这是编程小白必须要了解的

    [摘要]网络爬虫是爬虫的应用之一,那么python的爬虫流程是什么?这是编程小白必须要了解的,环球网校小编建议大家可以试着理解这些内容,也许对您的python学习有帮助,毕竟实践出真知,所以你要知道p ...

  3. PAI分布式机器学习平台编程模型演进之路

    摘要: 在云栖计算之旅第5期-大数据与人工智能大会上,来自阿里云大数据事业部的九丰分享了<PAI分布式机器学习平台编程模型演进之路>.他主要介绍了在集团中使用机器学习解决大数据问题时如何通 ...

  4. 编程小白学python知乎周刊_在知乎上学 Python - 入门篇

    写在前面 本文对知乎上关于Python入门方面的问答.文章.专栏做了一定的收集和整理,希望对各位Python学习者能有帮助,至少可以节省大家一点时间. 这一篇主要针对的是零基础或初学Python,包括 ...

  5. 学习python这门课的感受_关于我学习了编程小白的第一本Python入门书之后的感受 200110900207...

    关于我学习了<编程小白的第一本Python入门书>之后的感受 200110900207 计算机类2班 胡敏 其实这本书更多的不是写关于Python的介绍的,而是关于Python的学习,也就 ...

  6. Gabor滤波简介与Opencv中的实现及参数变化实验

    声明:本篇文章为转载,目的是便于以后查找学习 Gabor滤波是一种非常常见的特征提取算法,在人脸识别等领域有着很广泛的应用,在这里我主要介绍一下Gabor滤波器的公式及Opencv下的代码实现,以及我 ...

  7. 编程小白必懂的网络原理

    网络到底是如何组成的?为什么我们现在可以方便的上网? 不管你是不是计算机专业相关的人,你心中可能一直都会有这样的疑问! 而今天我们就来解决这件事情,告诉你真实的答案! 网络的基本构成 首先我们来看这样 ...

  8. 【“天才”必经之路】只需一年时间,从编程小白成为同事们敬仰的编程大神

    编程是什么?也许每个人都有不同的见解. 有人认为编程是一份工作,也有人认为编程是一种爱好,甚至有人认为编程是此生追求.其实,编程就是编写程序.   首先,从"编"字分析,它既可以表 ...

  9. 从编程小白到全栈开发:基于框架开发服务端

    上文中,我们了解了关于服务器端的一些概念知识,尤其是HTTP协议相关的最基本知识点,今天我想跟大家分享一下在平时正真的开发中,是如何来利用和体现这些内容的. 还记得我在<从编程小白到全栈开发:改 ...

最新文章

  1. 实现商城商品秒杀分析
  2. 打开ftp服务器上的文件夹时出错505,FTP提示505错误解决办法
  3. BigDecimal加减乘除运算
  4. KMS安装后激活机器
  5. [导入]C#实现Des加密和解密
  6. Linux: 让切换目录更方便: pushd,popd,dirs,cd -
  7. Android文本框输入汉字,android中EditText输入类型为何不能设置为中文
  8. 详细描述一下 Elasticsearch 搜索的过程?
  9. 毕啸南专栏 | 对话智联招聘CEO郭盛:未来的社会是透明的
  10. java8新日期时间类使用
  11. Damp;G“辱华”争议广告女主发声:几乎断送了模特事业
  12. 如何使用CSDN写博客?—CSDN基础知识汇总
  13. Python编程:从入门到实践.pdf :Python 基础笔记,最基本的 Python语法,快速上手入门 Python
  14. JAVA实现126邮箱发送及部署后发送邮箱报错问题
  15. Android Unable to execute dex: method ID not in [0, 0xffff]: 65536 问题解决方法
  16. 【数据库系统】第一部分 数据库基础(4) 数据库安全性
  17. 6 月直播 7 场全剧透。今天:飞腾CPU调优原理及方法 | 第 19 期
  18. jenkins部署流程图_jenkins怎样实现自动部署的流程图
  19. 重构ElementUI解决DatePicker日期选择组件修改父组件placement参数问题[Vue.js项目实践: 新冠自检系统]
  20. SQL Server-------数据库恢复技术

热门文章

  1. Telink TL825X 安信可TB-02在水塔水位控制器中的应用
  2. 药店app的布局html,药店列表(小三件套版本).html
  3. python中的等于“=”
  4. 用户和组管理命令介绍与详解
  5. REXROTH力士乐比例阀4WRZE25W8-220-7X/6EG24N9K31/A1D3M
  6. 立创商城中元器件封装的3d模型导出STEP格式文件
  7. 【FT2000/4+X100】调试记录2--如何让生成X100固件
  8. 计算器:中缀转后缀与后缀的计算
  9. 阿里P7 java架构师 springcloud、jvm、netty 、redis、数据结构、分布式高并发 视频 下载分享
  10. Oracle数据库中的方案,学习Oracle数据库_理解Oracle数据库中的方案