【图像处理知识复习】01画灰度直方图matlab, C++ 实现

灰度直方图是对图像中灰度级分布的统计,横坐标为灰度值,纵坐标是像素个数(也可以采用当前像素值个数占总像素个数的百分比)。这里直接统计个数。

1. matalb代码如下:

%画灰度直方图

%1, 读取图像
clc;
clear;
image = imread('D:\Code\Image\classic.jpg');
image = rgb2gray(image);
figure,imshow(image);

[row,col] = size(image);

grayNum = zeros(1,256); %列下标值[1,256]减一表示灰度值[0,255],保存某个灰度值[0,255]的像素个数

%2, 记录灰度值为image(i,j)像素个数
for i=1:row
    for j=1:col
            grayNum(image(i,j)+1) = grayNum(image(i,j)+1)+1; %灰度值加一就是列值
    end
end

%3, 画灰度直方图,将列下标[1,256]即灰度值,映射到[0,255]
figure,
bar(0:255,grayNum,'grouped');%第一个参数为横轴(即灰度值),第二个参数为纵轴(个数),第三个为直方图类型



效果:


2. C++ 代码实现:

#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;

int main()
{   
	Mat img = imread("D:/Code/Image/classic.jpg", 0); //以灰度图形式读入
	imshow("原图", img);

	int row = img.rows;
	int col = img.cols;
	int grayNum[256] = { 0 }; // 数组下标值等于灰度值

	//遍历整幅图像,统计个数
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			grayNum[img.at<uchar>(i, j)] = grayNum[img.at<uchar>(i, j)] + 1;
		}
	}


	// 画直方图
	double maxVal = 0;
	int i = 0;
	while (1)
	{
		if (i > 255)
			break;
		if (grayNum[i] > maxVal)
			maxVal = grayNum[i];
		i++;
	}

	int bin_num = 256; // [0,255]共256个bin
	Mat histImg(bin_num, bin_num, CV_8U, Scalar(255)); //生成白色画布(255)
	int hpt = static_cast<int>(0.9*bin_num); 
	//每个bin就是一条垂直线
	for (int i = 0; i<bin_num; i++){
		printf("%d ", i);
		int binVal = grayNum[i];
		int intensity = static_cast<int>(binVal*hpt / maxVal);  // 个数转化为长度,同样上面的灰度值也可以转化为长度
		//两点之间绘制一条线
		line(histImg, Point(i, bin_num),       //直方图下面的点
			Point(i, bin_num - intensity),     //直方图上面的点
			Scalar::all(0));
	}
	imshow("dd", histImg);


	waitKey(0);
	return 0;
}

效果图:


  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr.Q

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

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

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

打赏作者

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

抵扣说明:

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

余额充值