灰度直方图 202104-1 【CSP】

该博客介绍了一种计算给定灰度图像直方图的方法。通过输入图像的像素矩阵,程序逐行读取并统计每个灰度值的出现次数,从而得到直方图。示例展示了如何处理8比特灰度图像,并给出了对应的输出格式和测试案例。

问题描述

一幅长宽分别为 n 个像素和 m 个像素的灰度图像可以表示为一个 n×m 大小的矩阵 A。
其中每个元素 Aij(0≤i<n、0≤j<m)是一个 [0,L) 范围内的整数,表示对应位置像素的灰度值。
具体来说,一个 8 比特的灰度图像中每个像素的灰度范围是 [0,128)。

一副灰度图像的灰度统计直方图(以下简称“直方图”)可以表示为一个长度为 L 的数组 h,其中 h[x](0≤x<L)表示该图像中灰度值为 x 的像素个数。显然,h[0] 到 h[L−1] 的总和应等于图像中的像素总数 n⋅m。

已知一副图像的灰度矩阵 A,试计算其灰度直方图 h[0],h[1],⋯,h[L−1]。

输入格式

输入共 n+1 行。

输入的第一行包含三个用空格分隔的正整数 n、m 和 L,含义如前文所述。

第二到第 n+1 行输入矩阵 A。
第 i+2(0≤i<n)行包含用空格分隔的 m 个整数,依次为 Ai0,Ai1,⋯,Ai(m−1)。

输出格式

输出仅一行,包含用空格分隔的 L 个整数 h[0],h[1],⋯,h[L−1],表示输入图像的灰度直方图。

样例输入

4 4 16
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15

Data

样例输出

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Data

样例输入

7 11 8
0 7 0 0 0 7 0 0 7 7 0
7 0 7 0 7 0 7 0 7 0 7
7 0 0 0 7 0 0 0 7 0 7
7 0 0 0 0 7 0 0 7 7 0
7 0 0 0 0 0 7 0 7 0 0
7 0 7 0 7 0 7 0 7 0 0
0 7 0 0 0 7 0 0 7 0 0

Data

样例输出

48 0 0 0 0 0 0 29

Data

评测用例规模与约定

全部的测试数据满足 0<n,m≤500 且 4≤L≤256。

# include<iostream>
using namespace std;
int h[256],Aij;
int main() {
	int n,m,L;
	cin >> n >> m >> L;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin >>Aij;
			h[Aij]++;
		}
	}
	for(int i=0;i<L;i++){
		cout<<h[i];
		if(i!=L-1)
			cout<<" ";
	}		
	return 0;
}

### 实现CSP灰度直方图的C++代码 要生成CSP(Color Space Processing)中的灰度直方图,可以利用OpenCV库来简化图像处理过程。以下是基于OpenCV的一个简单示例程序,用于计算并绘制灰度直方图。 #### OpenCV简介 OpenCV是一个开源计算机视觉和机器学习软件库,支持多种编程语言,包括Python、Java以及C++等[^1]。它提供了丰富的函数接口,能够快速完成诸如读取图片、转换颜色空间、统计像素分布等功能。 下面展示一段完整的C++代码片段,演示如何加载一张彩色图片将其转为灰阶模式,并进一步构建该灰阶下的频率分布图表即所谓的“直方图”。 ```cpp #include <opencv2/opencv.hpp> #include <iostream> int main() { // 加载原始RGB图像文件 cv::Mat image = cv::imread("example.jpg", cv::IMREAD_COLOR); if (image.empty()) { std::cout << "Could not open or find the image!" << std::endl; return -1; } // 将输入图像转化为灰度版本 cv::Mat grayImage; cvtColor(image, grayImage, cv::COLOR_BGR2GRAY); int histSize = 256; // 灰度级数范围0~255共256个等级 float range[] = {0, 256}; // 定义直方图区间边界值 const float* histRange = {range}; bool uniform = true, accumulate = false; // 创建存储直方数据的空间 cv::Mat hist; calcHist(&grayImage, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange, uniform, accumulate); // 绘制直方图可视化图形部分 int hist_w = 512, hist_h = 400; int bin_w = cvRound((double)hist_w / histSize); cv::Mat histImage(hist_h, hist_w, CV_8UC3, cv::Scalar(0,0,0)); normalize(hist, hist, 0, histImage.rows, cv::NORM_MINMAX); for(int i=1;i<histSize;i++) { line(histImage, cv::Point(bin_w*(i-1), hist_h-cvRound(hist.at<float>(i-1))), cv::Point(bin_w*i,hist_h-cvRound(hist.at<float>(i))), cv::Scalar(255,0,0), 2, 8, 0 ); } imshow("Gray Histogram", histImage); waitKey(); return 0; } ``` 此段代码实现了以下几个功能模块: 1. **图像导入**:通过`cv::imread()`方法获取指定路径上的JPEG格式样本照片。 2. **色彩变换**:调用`cvtColor()`把BGR编码形式转变为单通道亮度表示法——也就是常说的标准黑白照效果。 3. **统计数据收集**:借助内置工具`calcHist()`针对每一个可能存在的明暗程度计数值做累加操作从而形成最终的结果向量。 4. **绘图呈现**:最后一步则是按照比例缩放后的高度差连接线条构成直观易懂的形式供观察者理解整体趋势变化情况。 以上就是关于怎样采用标准C++编写应用程序以展现特定区域内的光线强弱对比关系的方法介绍[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

创业者-杨成淦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值