图像卷积算法
2016-05-27 15:56
363 查看
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> /************************ src 输入的channel通道的数据 des 输出卷积数据 只有一通道,是channel 通道卷积之和 model 输入的模板数据 srcW 输入数据的宽度 srcH 输入数据的高度 desW 输出数据的宽度 (大于 srcW - modW + 1) desH 输出数据的高度 (大于 srcH - modH + 1) modW 模板的宽度 modH 模板的高度 offsetX 输出有效数据相对输出宽度的偏移 offsetX < modW - 1 offsetY 输出有效数据相对输出高度的偏移 offsetY < modH - 1 ************************/ int cpuConvolution(float * src, float * des, float * model, int srcW, int srcH, int desW, int desH, int modW, int modH, int offsetX, int offsetY, int channel) { int desValW = srcW - modW + 1; int desValH = srcH - modH + 1; int desValIndexX; int desValIndexY; int i, j, k; int m, n; for( i = 0; i < desH; i ++) { for(j = 0; j < desW; j ++) { desValIndexX = j - offsetX; desValIndexY = i - offsetY; if(i < offsetY || i >= offsetY + desValH || j < offsetX || j >= offsetX + desValW) { des[(i * desW + j)] = 0.0f; }else { for(m = 0; m < modH; m ++) { for(n = 0; n < modW; n ++) { for(k = 0; k < channel; k ++) { des[(i * desW + j)] += src[((desValIndexY + m) * srcW + (desValIndexX + n)) * channel + k] * model[ (m * modW + n) * channel + k]; } } } } } } return 0; } int _tmain(int argc, _TCHAR* argv[]) { int srcW = 15; int srcH = 10; int modW = 3; int modH = 3; int desW = 20; int desH = 15; float * src = (float *)malloc(srcW * srcH * sizeof(float) * 2); float * mod = (float *)malloc(modW * modH * sizeof(float) * 2); float * des = (float *)malloc(desW * desH * sizeof(float)); memset(src, 0, srcW * srcH * sizeof(float)); memset(des, 0, desW * desH * sizeof(float)); memset(mod, 0, modW * modH * sizeof(float)); for(int i = 0; i < srcH; i ++) { for(int j = 0; j < srcW * 2; j ++) { src[i * srcW * 2 + j] = 2.0f; printf("%f ",src[i * srcW * 2 + j]); } printf("%f\n", src[i * srcW * 2 + srcW - 1]); } for(int i = 0; i < modH; i ++) { for(int j = 0; j < modW * 2; j ++) { mod[i * modW * 2 + j] = 1.5f; } } cpuConvolution(src, des, mod, srcW, srcH, desW, desH, modW, modH, 5, 4, 2); printf("\n"); for(int i = 0; i < desH; i ++) { for(int j = 0; j < desW - 1; j ++) { printf("%f ",des[i * desW + j]); } printf("%f\n", des[i * desW + desW - 1]); } free(src); free(des); free(mod); system("pause"); return 0; }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析