数字识别代码java java 数字识别

java导入mnist后怎样识别一个数字

其实就是python怎么读取binnary file

创新互联专注于宜章网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供宜章营销型网站建设,宜章网站制作、宜章网页设计、宜章网站官网定制、小程序设计服务,打造宜章网络公司原创品牌,更为您提供宜章网站排名全网营销落地服务。

mnist的结构如下,选取train-images

TRAINING SET IMAGE FILE (train-images-idx3-ubyte):

[offset] [type] [value] [description]

0000 32 bit integer 0x00000803(2051) magic number

0004 32 bit integer 60000 number of images

0008 32 bit integer 28 number of rows

0012 32 bit integer 28 number of columns

0016 unsigned byte ?? pixel

0017 unsigned byte ?? pixel

........

xxxx unsigned byte ?? pixel

也就是之前我们要读取4个 32 bit integer

试过很多方法,觉得最方便的,至少对我来说还是使用

struct.unpack_from()

filename = 'train-images.idx3-ubyte'

binfile = open(filename , 'rb')

buf = binfile.read()

先使用二进制方式把文件都读进来

index = 0

magic, numImages , numRows , numColumns = struct.unpack_from('IIII' , buf , index)

index += struct.calcsize('IIII')

然后使用struc.unpack_from

'IIII'是说使用大端法读取4个unsinged int32

然后读取一个图片测试是否读取成功

im = struct.unpack_from('784B' ,buf, index)

index += struct.calcsize('784B')

im = np.array(im)

im = im.reshape(28,28)

fig = plt.figure()

plotwindow = fig.add_subplot(111)

plt.imshow(im , cmap='gray')

plt.show()

'784B'的意思就是用大端法读取784个unsigned byte

完整代码如下

import numpy as np

import struct

import matplotlib.pyplot as plt

filename = 'train-images.idx3-ubyte'

binfile = open(filename , 'rb')

buf = binfile.read()

index = 0

magic, numImages , numRows , numColumns = struct.unpack_from('IIII' , buf , index)

index += struct.calcsize('IIII')

im = struct.unpack_from('784B' ,buf, index)

index += struct.calcsize('784B')

im = np.array(im)

im = im.reshape(28,28)

fig = plt.figure()

plotwindow = fig.add_subplot(111)

plt.imshow(im , cmap='gray')

plt.show()

只是为了测试是否成功所以只读了一张图片

怎么用java实现图片里面的数字识别

图片是由点组成(或者是别的方法),记录点的位置、颜色,控制点就行了。至于ocr,有难度,首先要制作文字的变化范围及整个字各部分的联系,这还是简单的。然后,图像分解就行了。额,我不会编程,稍微会点c++,所以这个回答就是假设如果我做这种程序的思路。

用java语言写一个判断一个整数是否为质数的程序(要求利用三种方法逐步优化实现)

我写了几种方法,并逐步优化,并且对每一种方法进行了1000000次的调用测试每种方法的速度,仅供参考:

import java.math.BigInteger;

public class Test_04 {

/**

* 最笨重的一种方法,用该整数分别除以比它小的数,看是否能被整除

*/

public boolean isPrimeNum_1(int num) {

// 识别小于2的数

if (num  2) {

return false;

}

for (int i = 2; i  num; i++) {

if (num % i == 0) {

return false;

}

}

return true;

}

/**

* 优化第一种方法br

* 1、偶数不可能是质数br

* 2、对于大于2的数,如果一个数a大于数b的一半,那么b不可能被a整除

*/

public boolean isPrimeNum_2(int num) {

// 2特殊处理

if (num == 2) {

return true;

}

// 识别小于2的数和偶数

if (num  2 || num % 2 == 0) {

return false;

}

int max = num / 2;

for (int i = 3; i  max; i += 2) {

if (num % i == 0) {

return false;

}

}

return true;

}

/**

* 在第二种方法上再次优化,利用数字的性质:br

* 一个数不是素数就是合数,那么一定可以由两个自然数相乘得到,其中一个大于或等于它的平方根,br

* 一个小于或等于它的平方根,并且成对出现。br

* 这样就可以把计算量大幅度减少

*/

public boolean isPrimeNum_3(int num) {

if (num == 2) {

return true;// 2特殊处理

}

if (num  2 || num % 2 == 0) {

return false;// 识别小于2的数和偶数

}

double sqrt = Math.sqrt(num);

for (int i = 3; i = sqrt; i += 2) {

if (num % i == 0) {

return false;

}

}

return true;

}

/**

* Java中的BigInteger中已经写好了一个判断是否为质数的方法,直接用就可以了

*/

public boolean isPrimeNum_4(int num) {

BigInteger integer = BigInteger.valueOf(num);

return integer.isProbablePrime(1);

}

public static void main(String[] args) {

Test_04 test_04 = new Test_04();

int num = 991;

System.out.println(test_04.isPrimeNum_1(num));

long startTime = System.currentTimeMillis();

for (int i = 0; i  1000000; i++) {

test_04.isPrimeNum_1(num);

}

long endTime = System.currentTimeMillis();

System.out.println("第一种方法运行时间:" + (endTime - startTime) + "ms");

System.out.println(test_04.isPrimeNum_2(num));

startTime = System.currentTimeMillis();

for (int i = 0; i  1000000; i++) {

test_04.isPrimeNum_2(num);

}

endTime = System.currentTimeMillis();

System.out.println("第二种方法运行时间:" + (endTime - startTime) + "ms");

System.out.println(test_04.isPrimeNum_3(num));

startTime = System.currentTimeMillis();

for (int i = 0; i  1000000; i++) {

test_04.isPrimeNum_3(num);

}

endTime = System.currentTimeMillis();

System.out.println("第三种方法运行时间:" + (endTime - startTime) + "ms");

System.out.println(test_04.isPrimeNum_4(num));

startTime = System.currentTimeMillis();

for (int i = 0; i  1000000; i++) {

test_04.isPrimeNum_4(num);

}

endTime = System.currentTimeMillis();

System.out.println("第四种方法运行时间:" + (endTime - startTime) + "ms");

}

}

输出结果:

true

第一种方法运行时间:2732ms

true

第二种方法运行时间:671ms

true

第三种方法运行时间:68ms

true

第四种方法运行时间:1064ms


文章题目:数字识别代码java java 数字识别
URL标题:http://myzitong.com/article/ddjddec.html