python图像识别分类_opencv-python下简单KNN分类识别

KNN是数据挖掘中一种简单算法常用来分类,此次用来聚类实现对4种花的简单识别。

环境:python2.7+opencv3.0+windows10

原理:在使用KNN函数提取出4种花特征点以后,对需要辨认的图片提取体征点,与图库中4类花进行比较,匹配点最多的一类即视为同类。

代码:

读入图像数据:

1

2 img =cv2.imread(name)3

4 q_img=[1]*10

5 q_img[0] = cv2.imread("images/qiangwei1.jpg")6 q_img[1] = cv2.imread("images/qiangwei2.jpg")7 q_img[2] = cv2.imread("images/qiangwei3.jpg")8 q_img[3] = cv2.imread("images/qiangwei4.jpg")9 q_img[4] = cv2.imread("images/qiangwei5.jpg")10

11 x_img=[1]*10

12 x_img[0] = cv2.imread("images/xinghua1.jpg")13 x_img[1] = cv2.imread("images/xinghua2.jpg")14 x_img[2] = cv2.imread("images/xinghua3.jpg")15 x_img[3] = cv2.imread("images/xinghua4.jpg")16 x_img[4] = cv2.imread("images/xinghua5.jpg")17

18 t_img=[1]*10

19 t_img[0] = cv2.imread("images/taohua1.jpg")20 t_img[1] = cv2.imread("images/taohua2.jpg")21 t_img[2] = cv2.imread("images/taohua3.jpg")22 t_img[3] = cv2.imread("images/taohua4.jpg")23 t_img[4] = cv2.imread("images/taohua5.jpg")24

25 y_img=[1]*10

26 y_img[0] = cv2.imread("images/yinghua1.jpg")27 y_img[1] = cv2.imread("images/yinghua2.jpg")28 y_img[2] = cv2.imread("images/yinghua3.jpg")29 y_img[3] = cv2.imread("images/yinghua4.jpg")30 y_img[4] = cv2.imread("images/yinghua5.jpg")

获取灰度图:

gray =cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

q_gray=[1]*10q_gray[0]=cv2.cvtColor(q_img[0],cv2.COLOR_BGR2GRAY)

q_gray[1] = cv2.cvtColor(q_img[1],cv2.COLOR_BGR2GRAY)

q_gray[2] = cv2.cvtColor(q_img[2],cv2.COLOR_BGR2GRAY)

q_gray[3] = cv2.cvtColor(q_img[3],cv2.COLOR_BGR2GRAY)

q_gray[4] = cv2.cvtColor(q_img[4],cv2.COLOR_BGR2GRAY)

x_gray=[1]*10x_gray[0]=cv2.cvtColor(x_img[0],cv2.COLOR_BGR2GRAY)

x_gray[1] = cv2.cvtColor(x_img[1],cv2.COLOR_BGR2GRAY)

x_gray[2] = cv2.cvtColor(x_img[2],cv2.COLOR_BGR2GRAY)

x_gray[3] = cv2.cvtColor(x_img[3],cv2.COLOR_BGR2GRAY)

x_gray[4] = cv2.cvtColor(x_img[4],cv2.COLOR_BGR2GRAY)

t_gray=[1]*10t_gray[0]=cv2.cvtColor(t_img[0],cv2.COLOR_BGR2GRAY)

t_gray[1] = cv2.cvtColor(t_img[1],cv2.COLOR_BGR2GRAY)

t_gray[2] = cv2.cvtColor(t_img[2],cv2.COLOR_BGR2GRAY)

t_gray[3] = cv2.cvtColor(t_img[3],cv2.COLOR_BGR2GRAY)

t_gray[4] = cv2.cvtColor(t_img[4],cv2.COLOR_BGR2GRAY)

y_gray=[1]*10y_gray[0]=cv2.cvtColor(y_img[0],cv2.COLOR_BGR2GRAY)

y_gray[1] = cv2.cvtColor(y_img[1],cv2.COLOR_BGR2GRAY)

y_gray[2] = cv2.cvtColor(y_img[2],cv2.COLOR_BGR2GRAY)

y_gray[3] = cv2.cvtColor(y_img[3],cv2.COLOR_BGR2GRAY)

y_gray[4] = cv2.cvtColor(y_img[4],cv2.COLOR_BGR2GRAY)

获取keypoints,descriptor:

detect = cv2.xfeatures2d.SIFT_create(800)

kp,des=detect.detectAndCompute(gray,None)

q_kp=[1]*10q_des=[1]*10q_kp[0],q_des[0]=detect.detectAndCompute(q_gray[0],None)

q_kp[1],q_des[1] = detect.detectAndCompute(q_gray[1],None)

q_kp[2],q_des[2] = detect.detectAndCompute(q_gray[2],None)

q_kp[3],q_des[3] = detect.detectAndCompute(q_gray[3],None)

q_kp[4],q_des[4] = detect.detectAndCompute(q_gray[4],None)

x_kp=[1]*10x_des=[1]*10x_kp[0],x_des[0]=detect.detectAndCompute(x_gray[0],None)

x_kp[1],x_des[1] = detect.detectAndCompute(x_gray[1],None)

x_kp[2],x_des[2] = detect.detectAndCompute(x_gray[2],None)

x_kp[3],x_des[3] = detect.detectAndCompute(x_gray[3],None)

x_kp[4],x_des[4] = detect.detectAndCompute(x_gray[4],None)

t_kp=[1]*10t_des=[1]*10t_kp[0],t_des[0]=detect.detectAndCompute(t_gray[0],None)

t_kp[1],t_des[1] = detect.detectAndCompute(t_gray[1],None)

t_kp[2],t_des[2] = detect.detectAndCompute(t_gray[2],None)

t_kp[3],t_des[3] = detect.detectAndCompute(t_gray[3],None)

t_kp[4],t_des[4] = detect.detectAndCompute(t_gray[4],None)

y_kp=[1]*10y_des=[1]*10y_kp[0],y_des[0]=detect.detectAndCompute(y_gray[0],None)

y_kp[1],y_des[1] = detect.detectAndCompute(y_gray[1],None)

y_kp[2],y_des[2] = detect.detectAndCompute(y_gray[2],None)

y_kp[3],y_des[3] = detect.detectAndCompute(y_gray[3],None)

y_kp[3],y_des[4] = detect.detectAndCompute(y_gray[4],None)

使用Knn匹配类进行匹配:

bf =cv2.BFMatcher()

q_matches=[1]*10q_matches[0]= bf.knnMatch(des,q_des[0],k=2)

q_matches[1]= bf.knnMatch(des,q_des[1],k=2)

q_matches[2]= bf.knnMatch(des,q_des[2],k=2)

q_matches[3]= bf.knnMatch(des,q_des[3],k=2)

q_matches[4]= bf.knnMatch(des,q_des[4],k=2)

x_matches=[1]*10x_matches[0]= bf.knnMatch(des,x_des[0],k=2)

x_matches[1]= bf.knnMatch(des,x_des[1],k=2)

x_matches[2]= bf.knnMatch(des,x_des[2],k=2)

x_matches[3]= bf.knnMatch(des,x_des[3],k=2)

x_matches[4]= bf.knnMatch(des,x_des[4],k=2)

t_matches=[1]*10t_matches[0]= bf.knnMatch(des,t_des[0],k=2)

t_matches[1]= bf.knnMatch(des,t_des[1],k=2)

t_matches[2]= bf.knnMatch(des,t_des[2],k=2)

t_matches[3]= bf.knnMatch(des,t_des[3],k=2)

t_matches[4]= bf.knnMatch(des,t_des[4],k=2)

y_matches=[1]*10y_matches[0]= bf.knnMatch(des,y_des[0],k=2)

y_matches[1]= bf.knnMatch(des,y_des[1],k=2)

y_matches[2]= bf.knnMatch(des,y_des[2],k=2)

y_matches[3]= bf.knnMatch(des,y_des[3],k=2)

y_matches[4]= bf.knnMatch(des,y_des[4],k=2)

记录并对匹配点进行筛选:

sum1=0

sum2=0

sum3=0

sum4=0for i in range(5):for m,n inq_matches[i]:if m.distance < 0.55*n.distance:

sum1=sum1+1

for i in range(5):for m,n inx_matches[i]:if m.distance < 0.55*n.distance:

sum2=sum2+1

for i in range(5):for m,n int_matches[i]:if m.distance < 0.55*n.distance:

sum3=sum3+1

for i in range(5):for m,n iny_matches[i]:if m.distance < 0.55*n.distance:

sum4=sum4+1

返回结果:

if max(sum1,sum2,sum3,sum4)==sum1:return "蔷薇"

if max(sum1,sum2,sum3,sum4)==sum2:return "杏花"

if max(sum1,sum2,sum3,sum4)==sum3:return "桃花"

if max(sum1,sum2,sum3,sum4)==sum4:return "樱花"

gui使用利用wxformbuilder+wxpython开发的简单页面

最终文件:

20180418101639500882.png

效果图如下:

20180418101639578026.png

20180418101639681535.png

由于图库图片较少且算法较为简单,识别率不会很高。

原文地址:https://www.cnblogs.com/Aiden-/p/8871954.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值