首页 > 试题广场 >

题3

[编程题]题3
  • 热度指数:252 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

在图像处理中,卷积是常用的技术,现有P(h,w)的的图片,像素值为[0, 255]的整数。卷积核为K(m, m)的矩阵,元素值为[0, 1.]的浮点数,输出图像大小为O(h - m + 1, w - m + 1),其中h>=m, w>=m。卷积后中的图片O元素值计算如下,其中最后的输出像素值为向下取整的整数

现输入图片P和卷积核K,输出卷积后的图片O,图片按行输出,行内空格分隔。

第1行输入图片的大小h、w由空格分隔。

第2行到h+1行输入由空格分隔的w个像素值。

第h+2输入卷积核大小m。

第h+3行到h+2+m行输入由空格分隔的m卷积核值


输入描述:
第1行输入图片的大小h、w由空格分隔。

第2行到h+1行输入由空格分隔的w个像素值。

第h+2输入卷积核大小m。

第h+3行到h+2+m行输入由空格分隔的m卷积核值。


输出描述:
图片按行输出,行内空格分隔
示例1

输入

3 3
40 24 135
200 239 238
90 34 94
2
0.0 0.6
0.1 0.3

输出

106 176
162 174
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while((line = br.readLine()) != null){
            // 获得图片尺寸
            String[] imageSize = line.split(" ");
            int h = Integer.parseInt(imageSize[0]);
            int w = Integer.parseInt(imageSize[1]);
            int[][] image = new int[h][w];
            String[] row;
            // 获得图片数组
            for(int i = 0; i < h; i++){
                row = br.readLine().trim().split(" ");
                for(int j = 0; j < w; j++)
                    image[i][j] = Integer.parseInt(row[j]);
            }
            // 获得卷积核大小
            int k = Integer.parseInt(br.readLine());
            // 获得卷积核
            double[][] kernel = new double[k][k];
            for(int i = 0; i < k; i++){
                row = br.readLine().trim().split(" ");
                for(int j = 0; j < k; j++)
                    kernel[i][j] = Double.parseDouble(row[j]);
            }
            // 卷积
            convolution(image, kernel, h, w, k);
        }
    }
    
    // 卷积函数
    private static void convolution(int[][] image, double[][] kernel, int h, int w, int k) {
        // 滑窗
        for(int i = 0; i < h - k + 1; i++){
            StringBuilder row = new StringBuilder();
            for(int j = 0; j < w - k + 1; j++)
                row.append(weightSum(image, kernel, i, j) + " ");
            System.out.println(row.toString().trim());
        }
    }
    
    // 加权求和
    private static int weightSum(int[][] image, double[][] kernel, int rowStart, int colStart) {
        double result = 0;
        for(int i = rowStart; i < rowStart + kernel.length; i++){
            for(int j = colStart; j < colStart + kernel.length; j++)
                result += image[i][j]*kernel[i - rowStart][j - colStart];
        }
        return (int)result;
    }
}

发表于 2020-10-13 17:00:22 回复(0)
import math
h, w = list(map(int, input().split()))
graph = []
for _ in range(h):
    graph.append(list(map(int, input().split())))
m = int(input())
kernel = []
for _ in range(m):
    kernel.append(list(map(float, input().split())))
result = [[0 for _ in range(w - m + 1)] for _ in range(h - m + 1)]
def cnn(i, j, m):
    result = 0
    for ii in range(m):
        for jj in range(m):
            result += graph[i + ii][j + jj] * kernel[ii][jj]
    return min(math.floor(result), 255)
for i in range(h - m + 1):
    for j in range(w - m + 1):
        result[i][j] = cnn(i, j, m)
for i in range(h - m + 1):
    for j in range(w - m + 1):
        if j != w - m:
            print(result[i][j], end = " ")
        else:
            print(result[i][j])

发表于 2020-04-06 19:10:17 回复(0)

int a[1005][1005];
double b[1005][1005];
int ans[1005][1005];
int main() {
    ios::sync_with_stdio(0);
    int n,m,k;
    cin>>n>>m;

    forn(i,n){
        forn(j,m){
            cin>>a[i][j];
        }
    }
    cin>>k;

    forn(i,k){
        forn(j,k){
            cin>>b[i][j];
        }
    }

    for (int i = 0; i <= n - k + 1; i++){
        for (int j = 0; j <= m - k + 1; j++){
            double temp = 0;
            for(int u = 0; u <= m - 1; u++){
                for (int v = 0; v <= m - 1; v++){
                    temp += a[i+u][j+v] * b[u][v];
                }
            }
            ans[i][j] = min(int(temp), 255);

        }
    }
    for (int i =0 ;i < n - k + 1;i++){
        for (int j = 0; j < m - k + 1; j++){
            cout<<ans[i][j]<<" ";
        }
        cout<<endl;
    }
}


















暴力模拟即可
编辑于 2020-03-24 08:57:15 回复(0)
测试数据是不是有问题,加了和255值的对比通不过
去掉和255的对比就通过了
发表于 2019-11-24 22:14:18 回复(0)