计算机视觉+机器学习 (一)识别手写数字 (2)
下载完MNIST数据集会出现四个文件。
一.首先先解析测试图片并保存。
如下:(第一步:我把需要解析的文件放在了E盘“E://opencv-4.1.-/tensorflow_MNIST”,tensorflow_MNIST文件夹下
【注意,此刻的解析文件为MNIST数据集中的t10k-images.idx3-ubyte】)
(第二步:我把解析出来的图片命名格式为1.jpg,2.jpg,3.jpg,4.jpg...... 并保存在E盘“E://opencv-4.1.-/tensorflow_MNIST/testImages”,testImages文件夹下【注意,要在代码中“E://opencv-4.1.-/tensorflow_MNIST/testImages//”加两个单斜线如代码所示,之前出现过错误!】)
(第三步:等待解析,之后完成可以去相应文件夹打开查看,附截图一张【testImages文件夹下的测试图片】)
import numpy as np
import struct
import cv2
def readfile():#读取源图片文件
with open('E://opencv-4.1.0//tensorflow_MNIST//t10k-images.idx3-ubyte','rb') as f1:
buf1 = f1.read()
return buf1
def get_image(buf1):#解析并保存图片
image_index = 0
image_index += struct.calcsize('>IIII')
magic,numImages,imgRows,imgCols=struct.unpack_from(">IIII",buf1,0)
im = []
for i in range(numImages):
temp = struct.unpack_from('>784B', buf1, image_index)
im=np.array(temp)
im2=im.reshape(28,28)
cv2.imwrite("E://opencv-4.1.0//tensorflow_MNIST//testImages//"+str(i)+".jpg" , im2) #保存路径自己设置
image_index += struct.calcsize('>784B') # 28*28=784(B)
if i%20==0:#知道图片保存的进度
print(i)
else:
print(i)
if __name__ == "__main__":
image_data = readfile()
get_image(image_data)
cv2.waitKey(0)
cv2.destroyAllWindows()
二.然后可以开始解析训练集图片并保存
与一中的方法一致,只不过更改了一下路径还有保存文件夹的位置。【注意,此刻的解析文件为MNIST数据集中的train-images.idx3-ubyte】
(我将训练集图片保存在同样目录E盘“E://opencv-4.1.-/tensorflow_MNIST/trainImages”中trainImages文件夹下)代码如下:
import numpy as np
import struct
import cv2
def readfile():#读取源图片文件
with open('E://opencv-4.1.0//tensorflow_MNIST//train-images.idx3-ubyte','rb') as f1:
buf1 = f1.read()
return buf1
def get_image(buf1):#解析并保存图片
image_index = 0
image_index += struct.calcsize('>IIII')
magic,numImages,imgRows,imgCols=struct.unpack_from(">IIII",buf1,0)
im = []
for i in range(numImages):
temp = struct.unpack_from('>784B', buf1, image_index)
im=np.array(temp)
im2=im.reshape(28,28)
cv2.imwrite("E://opencv-4.1.0//tensorflow_MNIST//trainImages//"+str(i)+".jpg" , im2) #保存路径自己设置
image_index += struct.calcsize('>784B') # 28*28=784(B)
if i%20==0:#知道图片保存的进度
print(i)
else:
print(i)
if __name__ == "__main__":
image_data = readfile()
get_image(image_data)
cv2.waitKey(0)
cv2.destroyAllWindows()
附截图: