CSP 202104-1 灰度直方图

该博客讨论了如何通过编程解决一个矩阵中各数值出现次数的统计问题。提供了三种不同的解决方案,包括使用二维数组、一维数组以及仅用一个整型变量来记录矩阵中的值并计算它们的频率。这些方法都涉及到遍历矩阵并更新计数数组,最后输出统计结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目分析:

1、有一个矩阵 A,大小为 n * m,里面的每一个元素存的是 [0,L) 的值
2、有一个数组 h,长度为 L,其特点是:
(1)它的第 i 位的值是矩阵 A 里出现 i 这个数的次数
(2)注意,“位” 是指从 0 开始到 L - 1
3、求数组 h,并输出

解题思路:

1、用一个二维数组 A 存放矩阵 A
2、用一个一维数组 h 记录
3、遍历这个二维数组,里面的值出现一次,h 的相应位置就加 1

代码实现:

#include <stdio.h>
int main()
{
	int n, m, L; 
	int i, j;
	//输入矩阵的长宽和灰度的范围 
	scanf("%d %d %d", &n, &m, &L);
	
	//定义一个数组用来存放这个矩阵
	int A[500][500] = {0};
	
	//定义一个数组来记录某个数出现的次数
	int h[256] = {0};
	
	//输入矩阵
	for(i=0; i<n; i++)//控制行 
	{
		for(j=0; j<m; j++)//控制列
		{
			scanf("%d",&A[i][j]);
			h[A[i][j]]++; //出现一次就加一次
		} 
	} 
	
	//输出 h 数组 
	for(i=0; i<L; i++)
	{
		printf("%d ", h[i]);
	} 
	
	return 0;
}

另解1:

  • 我们发现,只要能用一个数组记录下来矩阵A里面有那些值就行,和它里面的顺序是没有关系的,所以我们也可以不使用二维数组,使用一维数组也是可以的:
#include <stdio.h>
int main()
{
	int n, m, L; 
	int i;
	//输入矩阵的长宽和灰度的范围 
	scanf("%d %d %d", &n, &m, &L);
	
	//定义一个数组用来存放这个矩阵
	int A[250000] = {0};
	
	//定义一个数组来记录 
	int h[256] = {0};
	
	//输入矩阵
	for(i=0; i<n*m; i++)
	{
			scanf("%d",&A[i]);
			h[A[i]]++;
	} 
	
	//输出 h 数组 
	for(i=0; i<L; i++)//控制行 
	{
		printf("%d ", h[i]);
	} 
	
	return 0;
}

另解2:

  • 其实我们再进一步稍微观察一下就会发现,矩阵 A 里的值真的需要用数组记录下来吗?
  • 其实那些值我们每次都只用过一次,之后就再也不需要用到了
  • 所以不妨就用一个 int 型变量 A 来记录,然后马上读取使用,使用之后,下次在重新刷新 A 的值,这样至始至终只用到了这一个 int 型的内存空间
#include <stdio.h>
int main()
{
	int n, m, L; 
	int i, j;
	int k;
	//输入矩阵的长宽和灰度的范围 
	scanf("%d %d %d", &n, &m, &L);
	
	//定义一个数组用来存放这个矩阵
	int A;
	
	//定义一个数组来记录 
	int h[256] = {0};
	
	//输入矩阵
	for(i=0; i<n*m; i++)
	{
			scanf("%d",&A);
			h[A]++;
	} 
	
	//输出 h 数组 
	for(i=0; i<L; i++)//控制行 
	{
		printf("%d ", h[i]);
	} 
	
	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]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

刘学.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值