|
根据二维数组生成卷积图二维数组,可以用于研究图形图像识别等.
比如数字2和5的点阵在X轴投影和Y轴投影上是非常相似的,那么分别对它们进行卷积运算后,两者的投影差异就非常大了,因此可以精确识别图形图像.
可以应用在对相似相近图像内容的识别准确度要求非常高的场景,如 证件号码/产品条码 的扫描识别等.
本例的思路是,先对原始传入的二维数组加一圈0,然后用九宫格权重去分别乘9个位置,得到的和作为输出,逐步移动卷积核,逐个输出,最终得到卷积图.
为方便理解,大量使用了中文注释,请见谅.
如,数字2的点阵为:
1 1 1
0 0 1
1 1 1
1 0 0
1 1 1
先加一圈0:
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
0 1 1 1 0
0 1 0 0 0
0 1 1 1 0
0 0 0 0 0
然后对0圈里面的每个点作为中心点去做卷积运算:
hang=2 lie=2
某中心点卷积结果:7
hang=2 lie=3
某中心点卷积结果:16
hang=2 lie=4
某中心点卷积结果:11
hang=3 lie=2
某中心点卷积结果:24
hang=3 lie=3
某中心点卷积结果:42
hang=3 lie=4
某中心点卷积结果:25
hang=4 lie=2
某中心点卷积结果:15
hang=4 lie=3
某中心点卷积结果:23
hang=4 lie=4
某中心点卷积结果:7
hang=5 lie=2
某中心点卷积结果:25
hang=5 lie=3
某中心点卷积结果:38
hang=5 lie=4
某中心点卷积结果:24
hang=6 lie=2
某中心点卷积结果:11
hang=6 lie=3
某中心点卷积结果:12
hang=6 lie=4
某中心点卷积结果:3
得到的卷积图是:
7 16 11
24 42 25
15 23 7
25 38 24
11 12 3
运算出来的卷积图也是一个二维数组,可以对它再进行一次卷积操作.
源码:
- import console;
- var 打印二维数组供观察 = function(tab){
- for(i1=1;table.count(tab);1){
- var str = ""
- for(i2=1;table.count(tab[i1]);1){
- str = str + " " + tab[i1][i2]
- }
- console.log(str)
- }
- }
- var 原始二维数组图 = {{1;1;1};{0;0;1};{1;1;1};{1;0;0};{1;1;1};}
- 打印二维数组供观察(原始二维数组图)
- //是个九宫格,从中宫开始9字形顺时针旋转排序 --- 这个权重数组可以自定义,不同权重组合有不同的效果
- var 卷积权重数组 = {3;4;5;2;1;6;9;8;7}
- var 生成卷积图二维数组 = function(tab){
- //传入二维数组,生成卷积后的二维数组
-
- //先加一圈0
-
- //给每一行前面和后面加上0
- for(i=1;table.count(tab);1){
- table.push(tab[i],0)
- table.insert(tab[i],0)
- }
-
- var tempShuzhu = {}
- for(i=1;table.count(tab[1]);1){
- table.push(tempShuzhu,0)
- }
-
- //在后面加一行全0的数组
- table.push(tab,tempShuzhu)
-
- //在前面加一行全0的数组
- table.insert(tab,tempShuzhu)
-
- console.log("生成卷积图二维数组,加了一圈0:")
- 打印二维数组供观察(tab)
-
- var 卷积图二维数组 = {}
- //逐个九宫区块乘以卷积权重数组输出到二维数组
- for(hang=2;table.count(tab)-1;1){//因为了加一圈零,从第2行第2列起才是原图的起点
-
- table.push(卷积图二维数组,{})//添加个子数组
-
- for(lie=2;table.count(tab[hang])-1;1){
- console.log("hang="+hang," lie="+lie)
-
- //原图中的第1个点作为中心点,与周边八个点逐个与卷积数组相乘,计出一个卷积位
- var 某中心点卷积结果;
-
-
- /*因为是从第2行第2列为中心点算起*/
- 某中心点卷积结果 = tab[hang-1][lie-1]*3 + tab[hang-1][lie]*4 + tab[hang-1][lie+1]*5
- + tab[hang][lie-1]*2 + tab[hang][lie]*1 + tab[hang][lie+1]*6
- + tab[hang+1][lie-1]*9 + tab[hang+1][lie]*8 + tab[hang+1][lie+1]*7
-
- console.log("某中心点卷积结果:"+某中心点卷积结果)
-
- //不能更新到原数组的同一个位置,不然卷积九宫格移动时会计算新数据
-
- table.push(卷积图二维数组[hang-1],某中心点卷积结果)
-
- }
- console.log('\r\n')
- }
-
- 打印二维数组供观察(卷积图二维数组)
- //console.dumpJson(tab)
- console.log("------------------------------------------")
- return 卷积图二维数组;
- }
- var 第一次卷积后数组 = 生成卷积图二维数组(原始二维数组图)
- var 第二次卷积后数组 = 生成卷积图二维数组(第一次卷积后数组)
- console.log("您输入的是" ,num );
- console.pause(true);
复制代码
建议把此卷积运算函数收进table库,传入二维数组和权重数组,返回卷积后的二维数组
|
|