图像处理
描述
灰度图像是每个像素只有一个采样颜色的图像。灰度图像与黑白图像不同,它在黑色与白色之间还有许多级的颜色深度。灰度图像的每个像素通常用8 bits的非线性尺度来保存,这样可以有256种灰度(8bits就是2的8次方=256)。每个像素的范围为[0...255]。
每个灰度图像可以用一个矩阵表示,每个矩阵元素对应灰度图像的灰度值,如下图所示。
示意图
图像处理中,包含了各种各样的操作,其中,我们定义了以下的7种操作:
操作类型1:顺时针旋转90度。
操作类型1示意图
操作类型2:逆时针旋转90度。
操作类型2示意图
操作类型3:垂直旋转。
操作类型3示意图
操作类型4:水平旋转。
操作类型4示意图
操作类型5:区域灰度值增加。区域内的所有像素增加指定的灰度值。如果增加后像素值大于255,则保持为255。
操作类型5示意图
操作类型6:区域灰度值减少。区域内的所有像素减少指定的灰度值。如果减少后像素值小于0,则保持为0。
操作类型6示意图
操作类型7:区域裁剪。
操作类型7示意图
给出图像对应的初始矩阵以及包含多个操作的序列。我们想知道当所有操作完成后,最后的矩阵的是怎么样的。
输入
每个输入数据包含多个测试点。
输入数据的第一行为S(S <= 10),表示测试数据有S个测试点。
测试点的第一行为N, M (1 <= N, M <= 100),表示矩阵的大小。之后N行,每行包含M个数字,表示对应的像素值,数字的范围在[0...255]。
之后一行是数T(1 <= T <= 50)。之后T行,每行表示一个操作。每行的第一个数表示操作类型。
其中,对于操作类型5和6,该行还会包括5个数x0, y0, x1, y1, value(0 < value <= 255)。分别表示区域左上角(x0, y0)以及区域右下角(x1, y1),该区域中所有像素值增加/减少value。对于操作类型7,该行还会包括4个数x0, y0, x1, y1,表示裁剪的区域左上角(x0, y0)和区域右下角(x1, y1)。
保证所有操作均合法,操作中指定的区域一定是矩阵中的合法区域。保证最后的矩形一定非空。
输出
对应每个测试点输出一行,包括四个数字,分别表示最后矩阵的大小,左上角(0, 0)的像素大小,以及所有像素值的总和。
- 样例输入
-
2 3 4 1 2 3 4 5 6 7 8 9 0 1 2 3 1 7 1 0 3 1 5 1 0 1 1 5 2 2 7 8 7 2 1 1
- 样例输出
-
3 2 0 34 2 2 7 24
网易互娱2017实习生招聘游戏研发工程师在线笔试第二场
1 # include <stdio.h> 2 # include <string.h> 3 4 int main() 5 { 6 int s; 7 scanf("%d",&s); 8 while(s--){ 9 int Array[110][110],temp[110][110],n,m,index = 0; 10 int t,sum = 0,i,j,ans; 11 memset(Array,0,sizeof(Array)); 12 memset(temp,0,sizeof(temp)); 13 scanf("%d %d",&n,&m); 14 for(i = 0;i < n;i++) 15 for(j = 0;j< m;j++){ 16 scanf("%d",&Array[i][j]); 17 sum += Array[i][j]; 18 } 19 20 scanf("%d",&t); 21 while(t--){ 22 int flag,x0,y0,x1,y1,val; 23 scanf("%d",&flag); 24 if(flag == 1){ 25 index = index ? 0:1; 26 for(i = 0;i < n;i++) 27 for(j = 0;j < m;j++){ 28 if(index) temp[j][n - i -1] = Array[i][j]; 29 30 else Array[j][n-i-1] = temp[i][j]; 31 } 32 if(index) ans = temp[0][0]; 33 else ans = Array[0][0]; 34 n = m + n; m = n - m; n = n - m; 35 } 36 if(flag == 2){ 37 index = index ? 0:1; 38 for(i = 0;i < n;i++) 39 for(j = 0;j < m;j++){ 40 if(index) temp[m - 1- j][i] = Array[i][j]; 41 else Array[m-1-j][i] = temp[i][j]; 42 } 43 if(index) ans = temp[0][0]; 44 else ans = Array[0][0]; 45 n = m + n; m = n - m; n = n - m; 46 } 47 if(flag == 3){ 48 index = index ? 0:1; 49 for(i = 0;i < n;i++) 50 for(j = 0;j < m;j++){ 51 if(index){ 52 temp[n - 1 - i][j] = Array[i][j]; 53 } 54 else Array[n-1-i][j] = temp[i][j]; 55 } 56 if(index) ans = temp[0][0]; 57 else ans = Array[0][0]; 58 } 59 60 if(flag == 4){ 61 index = index ? 0:1; 62 for(i = 0;i < n;i++) 63 for(j = 0;j < m;j++){ 64 if(index){ 65 temp[i][m - 1- j] = Array[i][j]; 66 } 67 else Array[i][m - 1- j] = temp[i][j]; 68 } 69 if(index) ans = temp[0][0]; 70 else ans = Array[0][0]; 71 } 72 73 if(flag == 5 || flag == 6){ 74 scanf("%d %d %d %d %d",&x0,&y0,&x1,&y1,&val); 75 if(flag == 6) val *= -1; 76 sum += val * (x1-x0+1)*(y1-y0+1); 77 if(index){ 78 for(i = x0;i <= x1;i++) 79 for(j = y0;j <= y1;j++){ 80 int x = temp[i][j] + val; 81 if(x < 0){ 82 sum -= x; 83 x = 0; 84 } 85 if(x > 255){ 86 sum = sum - (x-255); 87 x = 255; 88 } 89 temp[i][j] = x; 90 } 91 } 92 else{ 93 for(i = x0;i <= x1;i++) 94 for(j = y0;j <= y1;j++){ 95 int x = Array[i][j] + val; 96 if(x < 0){ 97 sum -= x; 98 x = 0; 99 } 100 if(x > 255){ 101 sum = sum - (x-255); 102 x = 255; 103 } 104 Array[i][j] = x; 105 } 106 } 107 if(index) ans = temp[0][0]; 108 else ans = Array[0][0]; 109 } 110 if(flag == 7){ 111 scanf("%d %d %d %d",&x0,&y0,&x1,&y1); 112 m = y1 - y0 + 1;n = x1 - x0 + 1;sum = 0; 113 index = index ? 0:1; 114 if(!index){ 115 memset(Array,0,sizeof(Array)); 116 for(i = x0;i <= x1;i++){ 117 for(j = y0;j <= y1;j++){ 118 Array[i-x0][j-y0] = temp[i][j]; 119 sum += temp[i][j]; 120 } 121 } 122 } 123 else{ 124 memset(temp,0,sizeof(temp)); 125 for(i = x0;i <= x1;i++){ 126 for(j = y0;j <= y1;j++){ 127 temp[i-x0][j-y0] = Array[i][j]; 128 sum += Array[i][j]; 129 } 130 } 131 } 132 if(index) ans = temp[0][0]; 133 else ans = Array[0][0]; 134 } 135 } 136 printf("%d %d %d %d\n",n,m,ans,sum); 137 } 138 return 0; 139 }