求matlab中的conv2卷积函数用c++如何实现

fengbingchun
领域专家: C/C++技术领域
2010-09-14 02:18:21
matlab中C = conv2(H1, H2, A, 'same');
这条语句用c++如何实现呢?
求大侠们帮帮忙!!!
...全文
965 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
freeboy1015 2012-09-22
  • 打赏
  • 举报
回复
调用opencv函数:

enum ConvolutionType {
/* Return the full convolution, including border */
CONVOLUTION_FULL,

/* Return only the part that corresponds to the original image */
CONVOLUTION_SAME,

/* Return only the submatrix containing elements that were not influenced by the border
*/
CONVOLUTION_VALID
};

void conv2(const Mat &img, const Mat& kernel, ConvolutionType type, Mat& dest) {
Mat source = img;
if(CONVOLUTION_FULL == type) {
source = Mat();
const int additionalRows = kernel.rows-1, additionalCols = kernel.cols-1;
copyMakeBorder(img, source, (additionalRows+1)/2, additionalRows/2,
(additionalCols+1)/2, additionalCols/2, BORDER_CONSTANT, Scalar(0));
}

Point anchor(kernel.cols - kernel.cols/2 - 1, kernel.rows - kernel.rows/2 - 1);
int borderMode = BORDER_CONSTANT;
filter2D(source, dest, img.depth(), flip(kernel), anchor, 0, borderMode);

if(CONVOLUTION_VALID == type) {
dest = dest.colRange((kernel.cols-1)/2, dest.cols - kernel.cols/2)
.rowRange((kernel.rows-1)/2, dest.rows - kernel.rows/2);
}
}
dengzikun 2010-09-14
  • 打赏
  • 举报
回复
cvFilter2D好象不是做卷积的.
效率问题需要优化.可以参考INTEL IPP库,看是否有类似的实现.
也可考虑用GPU优化,参考nvida的CUDA.
fengbingchun 2010-09-14
  • 打赏
  • 举报
回复
我在网上看到过这个代码,如果图像太大,效率会很低,不知用opencv的cvFilter2D函数是否与用conv2得到的结果一致呢?
dengzikun 2010-09-14
  • 打赏
  • 举报
回复
资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 使用Eigen库编写的C++卷积函数,其设计初衷是为了在计算系统响应、多项式乘法、滤波器设计以及图像处理等多个领域具有更广泛的适用性。除了实现MATLAB提供的卷积功能相似的部分外,该函数还增加了对边界处理条件的选择,以适应不同的应用场景需。 在MATLAB,conv和conv2函数分别用于计算一维和二维卷积,它们处理的是离散数据。而在C++实现,通过Eigen库的支持,可以将卷积操作扩展到更一般的情况。Eigen库是一个高效的C++矩阵计算库,它提供了丰富的矩阵操作功能,使得在C++进行复杂的数学运算变得更加方便和高效。 在C++卷积函数实现,首先需要考虑的是卷积操作的类型。与MATLAB类似,C++实现也提供了三种卷积操作类型:full、same和valid。这三种类型分别对应于不同的卷积结果尺寸和应用场景。full类型表示完整的卷积结果,其尺寸为输入矩阵尺寸之和减一;same类型表示输出矩阵与输入矩阵具有相同的尺寸;而valid类型则表示只计算有效的卷积结果,即不考虑边界效应的结果。 除了卷积操作类型外,边界处理条件也是卷积函数一个重要的考虑因素。在MATLAB卷积计算通常假设边界以外的点为零。然而,在某些应用场景,这种假设可能并不合理。因此,C++实现提供了三种边界处理条件:边界以外的点为零(默认)、边界以外的点与边界值相等、边界以外的点与另一边界上的点组成周期信号。这三种条件分别适用于不同的应用场景,例如图像处理可能需要考虑边界点的连续性,而在信号处理可能需要考虑信号的周期性。 在具体的实现过程C++卷积函数首先根据输入矩阵的尺寸和卷积操作类型计算出输出矩阵的尺寸。然后,根据边界处理条件,对输入矩阵进行必要的扩展或填充。接下来,通过双重循环遍

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧