2022-9-17科大讯飞笔试题-图像卷积

 

 

 

源码:

import java.util.Scanner;


public class Main {
     public int[][] datas;//数据元素
     public int rows;//行数
     public int cols;//列数
     public Main(int r, int c){
         datas = new int[r][c];//创建一个二维数组对象,行和列共同构成一个数据元素
         this.rows = r;
         this.cols = c;
     }
     //卷积运算
     public Main conv(Main Kernel){
      int width =Kernel.rows/2;//核函数的1/2宽度
      int length=Kernel.cols/2;//核函数的1/2宽度
         Main temp = new Main(this.rows+2*width,this.cols+2*length);//构建一个新的矩阵,用于卷积计算————核矩阵为偶数?如何处理
         //构建一个矩阵,用来进行计算
         for(int i = width; i<this.rows+width;i++){//矩阵要乘的行数
             for(int j = length;j<this.cols+length;j++){//每一行要乘的列数
              temp.datas[i][j]=datas[i-width][j-length];//构建上下边缘为空的矩阵,上下距离width length
             }
         }
         //循环计算结果矩阵中的值
         for(int i = width; i<this.rows+width;i++){//矩阵要乘的行数
          for(int j = length;j<this.cols+length;j++){//每一行要乘的列数
                 this.datas[i-width][j-length]=mutiKernel(Kernel,temp,i,j,width,length);//计算数值
             }
         }
         return this;
     }
     //使用核函数计算结果矩阵中每一个位置的值,
     public int mutiKernel(Main Kernel, Main temp, int i, int j, int width, int length) {
      int number =0;
       for(int m = 0; m<Kernel.rows;m++){//矩阵要乘的行数
              for(int n = 0;n<Kernel.cols;n++){//每一行要乘的列数
               number+=Kernel.datas[m][n]*temp.datas[i-width+m][j-length+n];//循环计算结果
              }
          } 
      return number;
     }
     public void display(){//打印矩阵                                                                                                                                                                                                
         if(this == null) return;
         for(int i = 0;i<this.rows;i++){
             for(int j = 0;j<this.cols;j++){
                 System.out.print(pd(this.datas[i][j])+" ");
             }
             System.out.println();
         }
 
     } 
     public Main turn(){//翻转矩阵  180度
         int temp=0;
         //水平翻转
         for (int i = 0; i < this.rows / 2; i++) {
             for (int j = 0; j < this.cols; j++) {
                 temp = this.datas[i][j];
                 this.datas[i][j] = this.datas[this.rows - 1 - i][j];
                 this.datas[this.rows - 1 - i][j] = temp;
             }
         }
         //垂直翻转
         for (int i = 0; i < this.rows; i++) {
             for (int j = 0; j < this.cols / 2; j++) {
                 temp = this.datas[i][j];
                 this.datas[i][j] = this.datas[i][this.cols - 1 - j];
                 this.datas[i][this.cols - 1 - j] = temp;
             }
         }
         return this;
     }

     public static int pd(int n){
         if(n<0){
             return 0;
         }
         if(n>255){
             return 255;
         }
         return n;
     }
     public static void main(String[] args) {

         Scanner sc = new Scanner(System.in);

      int l1,l2,p1,p2;
      l1 = sc.nextInt();
      l2 = sc.nextInt();
         p1 = sc.nextInt();
         p2 = sc.nextInt();
         Main m = new Main(l1,l2);
         Main m1 = new Main(p1,p2);
         for (int i = 0; i < l1; i++) {
             for (int j = 0; j < l2; j++) {
                 m.datas[i][j] = sc.nextInt();
             }
         }
         for (int i = 0; i < p1; i++) {
             for (int j = 0; j < p2; j++) {
                 m1.datas[i][j] = sc.nextInt();
             }
         }

         m.conv(m1).display();
     }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值