KNN算法中图像与矩阵转化:相关库及安装等问题解析
笔记:

以上部分主要讲解了 KNN 算法,该算法使用了现成的 28*28 数据,在实际做笔迹分析时,首先需要将图像转换为矩阵数据。
现在我们来介绍一下将图像转换为矩阵,将矩阵转换为图像的方法
矩阵被转换为图像
所需的库是 Python 映像库 (PIL)。
Windows 下 pip install 安装 PIL 失败,采取下载PIL.exe双击安装的方法
下载链接:
太平船务官方下载地址
import pandas as pd
import numpy as np
from PIL import Image
# load data
train = pd.read_csv('train.csv')
# now draw the numbers
for ind, row in train.iloc[0:3].iterrows():#iloc方法(介绍见后)来获得前3行数据
i = row[0]#[0]为标签项
arr = np.array(row[1:], dtype=np.uint8)#1-784列组成一幅图,,uint8为8位无符号整数
#arr = np.array(255 - row[1:], dtype=np.uint8)#如果需要颜色取反,用255减去当前每个像素点的值
arr.resize((28, 28))#把它变成28*28的矩阵
#save to file
im = Image.fromarray(arr)
im.save("./train_pics/%s-%s.png" % (ind, i))#第一个%s(ind)表示它是第几幅图像,第二个%s表示这个图像里面数字是几 ,注意该语句不能产生文件夹,需要现在指定目录建一个文件夹
.iloc() 方法
iloc[行位置,列位置] df.iloc[1,1]#选取第二行,第二列的值,返回的为单个值 df.iloc[0,2],:]#选取第一行及第三行的数据
图像被转换为矩阵
您需要的库是 OpenCV (Open Source Computer Vision),下载安装请参考附录
以下是它的一些简单功能
1. 静止图像的输入和输出
cv2.imread('xxx.png')#输入,#这里输入image的维度image.shape = (w,h,3),w*h是图片的长宽,3是BGR等三种颜色的channel值,每个值为0~255
cv2.imwrite('xxx.jpg', image)#输出
2. 将图片转换为灰度
#灰度图片的颜色channel只有一个,0~255表示灰度值
grayImage = cv2.imread('xxx.png',cv2.CV_LOAD_IMAGE_GRAYSCALE)
3. 更改图像的大小
print grayImage.shape#查看图像的shape,shape为(137,301),如果查看的是图像的size,则为42137(41237=137*301) res=cv2.resize(grayImage,(28,28),interpolation=cv2.INTER_CUBIC)#将图片grayImage以cv2.INTER_CUBIC方式变化为(28,28)大小的图片
变换方法:
以下是输入、输出、更改为灰度、更改图像大小、显示以及注意图像在窗口中的显示的完整过程
import cv2
image = cv2.imread('111.png')#读
cv2.imwrite('111.jpg', image)#写
grayImage = cv2.imread('111.png',cv2.CV_LOAD_IMAGE_GRAYSCALE)
print grayImage.shape
res=cv2.resize(grayImage,(28,28),interpolation=cv2.INTER_CUBIC)
#显示图像
cv2.imshow('test',grayImage)#显示灰度图
cv2.imshow('change',res)#显示改变了大小的图
#捕获键盘输入
k=cv2.waitKey(0)
if k==27:#27表示ESC键
cv2.destroyWindow()
cv2.imshow() 用于在窗口中显示图像,并且必须后跟 cv2.waitKey() 函数以使显示持续,否则显示程序将中止并且窗口将关闭。cv2.waitKey() 函数捕获键盘的输入,cv2.destroyWindow() 是释放窗口。
在学会了如何读取和输出图片之后,我们可以使用书面的 KNN 算法来识别我们的笔迹。
问题:
我用了大量的手写数据来验证识别准确,发现准确率不够高。主要问题是
:
1. 图片的大小是个问题,调整大小不宜把整张图片变成28*28的图片,而应该用数字标识中心图片,去掉旁边的白边
2. 手写数码照片,不保证书写处为黑色(像素值为 255)。
解: 由于纸张拍摄问题,您需要使用滤镜来减少像素值。由于没有滤镜,我用写在绘图板上的数字换掉了照片。
3. 字迹的粗细会影响判断
解决方法:这可能是训练样本不够,整体训练样本的笔迹太粗,输入非常细的笔迹时无法识别。此外,还应监控输入字体的粗细,将非常细的笔迹膨胀,并将非常粗的笔迹腐蚀
附件:python_OpenCV安装
我在网上看到了很多关于在 VS 环境下安装 OpenCV 的教程,也一直在 windows7、32 位、sublime+cmd 环境下编写 python,所以我琢磨了一下在这种情况下安装 OpenCV
使用 pip install numpy 语句安装 numpy
(如果您收到错误 Microsoft Visual C++ 9.0 is required,请以管理员身份安装 Microsoft Visual C++ 9.0,重新启动计算机,然后使用 pip install numpy 语句安装 numpy
。
OpenCV2.4.10 下载
下载完成后,解压(任意位置),将解压目录 build->python->2.7->x86 的 opencv 文件夹中的 cv2.pyd 文件复制到 python2.7\Lib\site-packages
要测试安装是否成功,请运行 sources\samples\python\drawing.py 或进入 Python 环境并使用 import cv2
更多Python相关内容,对本站感兴趣的读者可以查看本站的专题:“Python 数学计算技巧总结”、“Python数据结构与算法教程”、“Python函数使用技巧总结”、“Python字符串作技巧总结”、“Python入门及进阶经典教程”和“Python 文件与目录作技巧总结”。
我希望这篇文章对你的 Python 编程有帮助。