gpt4 book ai didi

c++ - 图像卷积和边界

转载 作者:行者123 更新时间:2023-11-28 05:40:30 24 4
gpt4 key购买 nike

我一直在尝试将卷积算法实现到一维数组上,但需要表示为二维 NxM 矩阵。在尝试实现与此类似的方法之后:

int kCenterX = kCol / 2;
int kCenterY = kRow / 2;

for(int i=0; i < mRow; ++i) { // rows
for(int j=0; j < mCol; ++j) { // columns

for(int m=0; m < kRow; ++m) { // kernel rows
int mm = kRow - 1 - m; // row index of flipped kernel
for(int n=0; n < kCol; ++n) { // kernel columns
int nn = kCol - 1 - n; // column index of flipped kernel

// index of input signal, used for checking boundary
int ii = i + (m - kCenterY);
int jj = j + (n - kCenterX);

// ignore input samples which are out of bound
if( ii >= 0 && ii < mRow && jj >= 0 && jj < mCol )
o[i][j] += input[ii][jj] * kern[mm][n];
}
}
}
}

来源:http://www.songho.ca/dsp/convolution/convolution.html#convolution_2d

鉴于给定的两个矩阵是:

input = {1,2,3,4,5,6,7,8,9,10,11,12,15,16};
// 1 2 3 4
// 5 6 7 8
// 9 10 11 12
// 13 14 15 16

sharpen_kernel = {0,-1,0,-1,5,-1,0,-1,0};
// 0 -1 0
// -1 5 -1
// 0 -1 0

问题是开发它的编码器设置边缘之外的所有值都是 0。那么我可以使用什么方法来检查元素何时位于数组的边缘,然后推出这些值以便计算它们与内核值。本质上将矩阵表示为:

1    1   2   3   4   4
1 *1 2 3 4* 4
5 *5 6 7 8* 8
9 *9 10 11 12* 12
13 *13 14 15 16* 16
13 13 14 15 16 16

最佳答案

这是更新后的代码

int kCenterX = kCol / 2;
int kCenterY = kRow / 2;

for(int i=0; i < mRow; ++i) { // rows
for(int j=0; j < mCol; ++j) { // columns

for(int m=0; m < kRow; ++m) { // kernel rows
int mm = kRow - 1 - m; // row index of flipped kernel
for(int n=0; n < kCol; ++n) { // kernel columns
int nn = kCol - 1 - n; // column index of flipped kernel

// index of input signal, used for checking boundary
int ii = i + (m - kCenterY);
int jj = j + (n - kCenterX);

if(ii < 0)
ii=ii+1;
if(jj < 0)
jj=jj+1;
if(ii >= mRow)
ii=ii-1;
if(jj >= mCol)
jj=jj-1;
if( ii >= 0 && ii < mRow && jj >= 0 && jj < mCol )
o[i][j] += input[ii][jj] * kern[mm][n];

}
}
}
}

关于c++ - 图像卷积和边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37223034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com