拉普拉斯高通滤波找边缘
问题描述
对于一个数列 f, 定义其 2 阶差分为:L( f[n] ) = f[n+1] - 2*f[n] + f[n-1], L 也称为拉普拉斯算子。我们计算数列 f 和 拉普拉斯核 [1, -2, 1] 的卷积, 计算过程见样例说明。
输入格式
第一行一个整数 n, 表示数列由 n 个整数组成, 3≤n≤1000。 第二行 输入空格分隔的 n 个整数, 表示数列 f。
输出格式
输出 n-2 个整数,表示拉普拉斯卷积后的序列,整数之间以空格分隔。
样例输入
10
1 1 1 2 3 4 3 2 2 2
样例输出
0 1 0 0 -2 0 1 0
样例说明:
拉普拉斯核: 1 -2 1
f 序列为:
1 1 1 2 3 4 3 2 2 2
当前位置拉普拉斯计算:
序列与核[1, -2, 1] 上下对应元素相乘并相加, 输出第 1 个元素: 1 * 1 + (-2)*1 + 1 * 1 = 0。
拉普拉斯核向右偏移一步:
拉普拉斯核: 1 -2 1
f 序列为: 1 1 1 2 3 4 3 2 2 2
计算输出第 2 个元素: 1 * 1 + (-2)*1 + 1* 2 = 1
拉普拉斯核重复向右偏移一步,每次计算一个输出,直到:
拉普拉斯核: 1 -2 1
f 序列为: 1 1 1 2 3 4 3 2 2 2
计算输出第 8 个元素: 1 * 2 + (-2)*2 + 1* 2 = 0。
注意输出结果序列比原始序列f的长度小2,这是由边界对齐计算条件造成的。
#include <stdio.h>
int main() {
int n, i, x1, x2, x3;
scanf("%d", &n);
int a[n] = {0};
if (n >= 3 && n <= 1000) {
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (i = 0; i < n - 2; i++) {
x1 = a[i] * 1;
x2 = a[i + 1] * (-2);
x3 = a[i + 2] * 1;
printf("%d ", x1 + x2 + x3);
}
}
return 0;
}
标签:输出,数列,637,拉普拉斯,整数,xdoj,计算,序列
From: https://blog.csdn.net/2401_87822230/article/details/144000877