题目:在本练习中,我们使用二维阵列img表示输入图像,使用二维阵列核表示卷积核。需要根据下面的图像卷积算法计算img的卷积结果。另外,请从用户输入中读取滑过img的步幅。
package package1;
import java.util.Scanner;
public class practice6 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入图片边长:");
int imgLength = input.nextInt();
int[][] img = new int[imgLength][imgLength];
System.out.println("请输入数组元素:");
for(int i = 0;i < imgLength;i++) {
for(int j = 0;j < imgLength;j++) {
img[i][j] = input.nextInt();
}
}
System.out.println("请输入卷积核边长(小于图片边长):");
int kerLength = input.nextInt();
int[][] kernel = new int[kerLength][kerLength];
System.out.println("请输入卷积核元素:");
for(int i = 0;i < kerLength;i++) {
for(int j = 0;j < kerLength;j++) {
kernel[i][j] = input.nextInt();
}
}
System.out.println("请输入步长:");
int stride = input.nextInt();
convolution(img,kernel,stride);
input.close();
}
public static void convolution(int[][] img,int[][] kernel,int stride) {
//卷积结果数组的大小
int r = (img.length - kernel.length) / stride + 1;
int c = (img[0].length - kernel[0].length) / stride + 1;
int[][] result = new int[r][c];
for(int i = 0,x = 0;i < r;i++,x += stride) {
for(int j = 0,y = 0;j < c;j++,y += stride) {
//计算每一个结果
for(int m = 0;m < kernel.length;m++) {
for(int n = 0;n < kernel[0].length;n++) {
result[i][j] += img[m + x][n + y] * kernel[m][n];
}
}
}
}
System.out.println("卷积结果为:");
for(int i=0;i<r;i++) {
for(int j=0;j<c;j++) {
System.out.print(result[i][j] + " ");
}
System.out.println();
}
}
}
运行结果示例:
粗心大意,之前把for循环里n的范围写成“j<kernel[0].length”,一直数组越界报错,改了好久才发现。