测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A37636. 图像压缩问题描述B.灰度图像有 256 级灰阶,编码 00-FF,对应 0-255,即图像有很多点,每个点取值是 00 到 FF。编程压缩到 16 级灰阶,对应 0-F。C.压缩规则:统计出每种灰阶的数量,取数量最多的前 16 种灰阶(如某种灰阶的数量与另外一种灰阶的数量相同,则以灰阶值从小到大为序),分别编号 0-F。其他灰阶转换到最近的 16 种灰阶之一,将某个点灰阶数与 16 种灰阶种的一…

填空题 困难

题目描述

图像压缩

问题描述

B.灰度图像有 256 级灰阶,编码 00-FF,对应 0-255,即图像有很多点,每个点取值是 00 到 FF。编程压缩到 16 级灰阶,对应 0-F。

C.压缩规则:统计出每种灰阶的数量,取数量最多的前 16 种灰阶(如某种灰阶的数量与另外一种灰阶的数量相同,则以灰阶值从小到大为序),分别编号 0-F。其他灰阶转换到最近的 16 种灰阶之一,将某个点灰阶数与 16 种灰阶种的一种相减,绝对值最小即为最近。

D.输入:多行数据,每行数据等长,每两个字符构成一个点,十六进制;输出:首先连续最多输出 16 种灰阶编码,不足 16 种灰阶就按实际输出;然后各行输出压缩后的编码,每行等长。

输入描述

A.第 1 次输入正整数 n,表示有多少行数据。

B.随后输入 n 行数据。

C.特别提示:常规程序中,输入时好习惯是有提示。考试时由于系统限定,输入时所  有 input()函数不可有提示信息。

输出描述

1.首先输出 16 种灰阶编码,共计 32 个字符。不足 16 种按实际输出。输出数量最多的 16 种灰阶,从多到少;如某种灰阶的数量与另外一种灰阶的数量相同,则以灰阶值从小到大为序;

2.特别提示:注意输出字母为大写,小写将判为错误,数本身与字母 T 和 F 之前没有空格。

样例输入

10

00FFCFAB00FFAC09071B5CCFAB76

00AFCBAB11FFAB09981D34CFAF56

01BFCEAB00FFAC0907F25FCFBA65

10FBCBAB11FFAB09981DF4CFCA67

00FFCBFB00FFAC0907A25CCFFC76

00FFCBAB1CFFCB09FC1AC4CFCF67

01FCCBAB00FFAC0F071A54CFBA65

10EFCBAB11FFAB09981B34CFCF67

01FFCBAB00FFAC0F071054CFAC76

1000CBAB11FFAB0A981B84CFCF66

样例输出

ABCFFF00CB09AC07101198011B6776FC

321032657CD10E

36409205ACC16D 

B41032657FD16D 

8F409205ACF14D

324F326570D1FE

3240C245FC411D 

BF4032687CD16D 

8F409205ACC11D 

B240326878D16E 

83409205ACE11D

样例解释 1

灰阶'AB'、'CF'和'FF'出现 14 次,'00'出现 10 次,'CB'出现 9 次,

'09'出现 7 次,'AC'出现 6 次,'07'出现 5 次,

'10'、'11'和'98'出现 4 次,'01'、'1B'、'67'、'76'和'FC'出现 3 次。

参考答案

#include <iostream> #include <cstring> using namespace std; int image[20][20]; int cpimg[20][20]; int his[256]; int color[16]; // 一位十六进制字符转换为数字 int trans(char a) { if (a <= '9') return (a - '0'); return (a - 'A' + 10); } // 一位十六进制数字转换为字符 char itrans(int n) { if (n >= 10) return (char)(n - 10 + 'A'); return (char)(n + '0'); } // 寻找离 c 最近的灰阶 int compress(int c) { int dis = 256, res = -1; for (int i = 0; i < 16; i++) { int d = c - color[i]; if (d < 0) d = -d; if (d < dis) { dis = d; res = i; } } return res; } int main() { int N = 0, M = 0; cin >> N; // 灰阶计数,初始化为 0 for (int i = 0; i < 256; i++) his[i] = 0; // 输入图像,并对灰阶计数 for (int i = 0; i < N; i++) { char line[50]; cin >> line; M = strlen(line) / 2; for (int j = 0; j < M; j++) { int c = trans(line[j * 2]) * 16 + trans(line[j * 2 + 1]); image[i][j] = c; his[c]++; } } // 选取出现次数最多的 16 个灰阶 for (int c = 0; c < 16; c++) { int max = -1, max_id = -1; for (int i = 0; i < 256; i++) if (his[i] > max) { max = his[i]; max_id = i; } color[c] = max_id; his[max_id] = -1; } // 将 image 的灰阶压缩为 cpimg for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) cpimg[i][j] = compress(image[i][j]); // 输出选取的 16 个灰阶 for (int c = 0; c < 16; c++) cout << itrans(color[c] / 16) << itrans(color[c] % 16); cout << endl; // 输出压缩后的图像 for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) cout << itrans(cpimg[i][j]); cout << endl; } return 0; }
上一题 下一题