文档章节

MATLAB conv2卷积的实现

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:46
字数 368
阅读 7
收藏 0

二维卷积的算法原理比较简单,参考任意一本数字信号处理的书籍,而matlab的conv2函数的滤波有个形状参数,用下面的一张图很能说明问题:


这里给出本人自己的实现方案,代码的优化空间很大,用到了自己目前开发的FastIV中的一些函数接口。具体实现如下:

#include "fiv_core.h"

typedef enum{
	FIV_CONV2_SHAPE_FULL,
	FIV_CONV2_SHAPE_SAME,
	FIV_CONV2_SHAPE_VALID
}FIV_CONV_SHAPE;


void fIv_conv2(fIvMat** dst_mat, fIvMat* src_mat, fIvMat* kernel_mat, FIV_CONV_SHAPE shape)
{
	int src_row = src_mat->rows;
	int src_cols = src_mat->cols;
	int kernel_row = kernel_mat->rows;
	int kernel_cols = kernel_mat->cols;
	int dst_row = 0, dst_cols = 0, edge_row = 0, edge_cols = 0;
	int i,j, kernel_i,kernel_j,src_i,src_j;
	fIvMat* ptr_dst_mat = NULL;
	
	switch(shape){
		case FIV_CONV2_SHAPE_FULL:	
			
			dst_row = src_row + kernel_row - 1;
			dst_cols = src_cols + kernel_cols - 1;		
			edge_row = kernel_row - 1;
			edge_cols = kernel_cols - 1;
			break;
			
		case FIV_CONV2_SHAPE_SAME:
			
			dst_row = src_row;
			dst_cols = src_cols;
			edge_row = (kernel_row - 1) / 2;
			edge_cols = (kernel_cols - 1) / 2;
			break;
			
		case FIV_CONV2_SHAPE_VALID:
			
			dst_row = src_row - kernel_row + 1;
			dst_cols = src_cols - kernel_cols + 1;
			edge_row = edge_cols = 0;
			break;
			
	}
	
	ptr_dst_mat = fIv_create_mat(dst_row, dst_cols, FIV_64FC1);
	*dst_mat = ptr_dst_mat;
	
	for (i = 0; i < dst_row; i++) {	
		ivf64* ptr_dst_line_i = (ivf64* )fIv_get_mat_data_at_row(ptr_dst_mat, i);	
		for (j = 0; j < dst_cols; j++) {		
			ivf64 sum = 0;
			
			kernel_i = kernel_row - 1 - FIV_MAX(0, edge_row - i);
			src_i = FIV_MAX(0, i - edge_row);
			
			for (; kernel_i >= 0 && src_i < src_row; kernel_i--, src_i++) {
				
				ivf64* ptr_src_line_i,*ptr_kernel_line_i;
				
				kernel_j = kernel_cols - 1 - FIV_MAX(0, edge_cols - j);
				src_j = FIV_MAX(0, j - edge_cols);
				
				ptr_src_line_i = (ivf64*)fIv_get_mat_data_at_row(src_mat, src_i);
				ptr_kernel_line_i = (ivf64*)fIv_get_mat_data_at_row(kernel_mat, kernel_i);
				
				ptr_src_line_i += src_j;
				ptr_kernel_line_i += kernel_j;
				
				for (; kernel_j >= 0 && src_j < src_cols; kernel_j--, src_j++){
					sum += *ptr_src_line_i++ * *ptr_kernel_line_i--;
					}
			}			
			ptr_dst_line_i[j] = sum;
		}
	}
}


FIV_ALIGNED(16) ivf64 ker_data[4*4] = {0.1,0.2,0.3,0.4,
									   0.5,0.6,0.7,0.8,
									   0.9,1.0,1.1,1.2,
									   1.3,1.4,1.5,1.6};



void test_conv2()
{
	fIvMat* src_mat = fIv_create_mat_magic(8, FIV_64FC1); // 8x8 magic matrix
	fIvMat* kernel_mat = fIv_create_mat_header(4, 4, FIV_64FC1);

	fIvMat* dst_mat = NULL;
	fIv_set_mat_data(kernel_mat, ker_data, (sizeof(ivf64)) * 4 * 4);

	fIv_conv2(&dst_mat, src_mat, kernel_mat, FIV_CONV2_SHAPE_FULL);

	fIv_export_matrix_data_file(dst_mat,"dst_mat_4x4-full.txt", 1);


	fIv_release_mat(&src_mat);
	fIv_release_mat(&kernel_mat);
	fIv_release_mat(&dst_mat);



}

int main()
{
	test_conv2();

	return 0;
}


本文转载自:http://www.cnblogs.com/celerychen/p/3967048.html

abcijkxyz
粉丝 63
博文 6196
码字总数 1876
作品 0
深圳
项目经理
私信 提问
稀疏矩阵二维卷积快速算法 conv2源码

各位同学,谁有matlab 函数 conv2源码,或者是稀疏矩阵二维卷积快速算法,我最近需要写稀疏矩阵二维卷积快速算法的C程序,急,拜托啦!!

王大海
2012/04/10
783
4
LeNet在caffe中的实现分析

文章作者:Tyan 博客:noahsnail.com | CSDN | 简书 本文主要是对Caffe中mnist数据集上训练的LeNet模型进行结构分析和可视化。

Quincuntial
2017/07/04
0
0
用Excel理解神经网络

为了简化卷积神经网络这个概念,我将试着针对在开发深度学习模型过程中所做的运算进行解释。要查阅这方面更多的内容,我建议在线搜索,因为网上的信息很多很多(像这样视频)。本文的这个解释...

【方向】
2017/12/05
0
0
人工智能教程009:创建一个卷积神经网络(4)

编程实现 权重初始化 为了创建这个模型,我们需要创建大量的权重和偏置项。这个模型中的权重在初始化时应该加入少量的噪声来打破对称性以及避免0梯度。由于我们使用的是ReLU神经元,因此比较...

韦东沛
2018/05/19
0
0
用Excel理解神经网络

摘要:为了简化卷积神经网络这个概念,本文将试着基于excel针对在开发深度学习模型过程中所做的运算进行解释。 为了简化卷积神经网络这个概念,我将试着针对在开发深度学习模型过程中所做的运...

阿里云云栖社区
2017/12/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

RS-232、RS422和RS-485的区别和各自的实现方式

一、殊途同归 RS-232、RS422和RS-485 均属于UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),仅用两根信号线(Rx 和Tx)就可以完成通信过程; 而由于各自使用的电...

rainbowcode
43分钟前
0
0
spring 本类中方法调用另外一个方法事务不生效

1、在spring配置文件中添加 <aop:aspectj-autoproxy expose-proxy="true" proxy-target-class="true" />声明自动代理 <!-- 标识通过aop框架暴露该代理,aopContext能够访问. --> proxy-targe......

重城重楼
49分钟前
5
0
项目 banner 乱弹

------------------------------------------ 村上春树 ------------------------------------- 如果我爱你,而你也正巧爱我,你头发乱了的时候,我会笑笑地替你拨一拨,然后手还留恋地在你...

宿小帅
今天
3
0
PHP获取未来七天的日期和星期

php获取未来七天的日期和星期代码 第一步:获取需要天数的日期,然后调用函数 //获取未来七天的日期 for($i=1;$i<8;$i++){ $dateArray[$i]=date('Y-m-d',strtotime(d...

一只懒猫-
今天
2
0
总结:IO模型

分类 多路复用 参考文章: https://www.jianshu.com/p/6a6845464770 https://www.cnblogs.com/zingp/p/6863170.html https://blog.csdn.net/sehanlingfeng/article/details/78920423......

浮躁的码农
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部