图像直方图从零开始实现

本文详细介绍了如何从零开始实现彩色图像的BGR三个通道直方图的计算和显示,包括算法流程、代码实现及归一化处理。通过自定义函数`calculate_histogram`统计每个灰度值的频数,并使用`Normalize`进行直方图数据的归一化,以适应显示界面。文章还展示了改进版代码,添加了滑动条以改变直方图的组距,并与OpenCV API计算的直方图进行了对比,证实结果一致。
摘要由CSDN通过智能技术生成

计算图像的直方图(从零开始实现)
一、算法流程
实现彩色图像的BGR三个通道的直方图显示
1、加载图像
2、RGB三通道分离
3、定义参数变量
4、分别计算BGR通道的直方图
5、归一化直方图数据
6、绘制直方图
二、代码部分
主函数部分

//主函数部分
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
Mat calculate_histogram(Mat src, int bins_w);//bins_w为直方图组距
Mat Normalize(Mat hist, int rangeMin, int rangeMax);
int main()
{
   
	Mat src;
	src = imread("4.png");
	imshow("源图像", src);

	vector<Mat> bgr_plane;
	split(src, bgr_plane);
	//计算每个通道的直方图
	Mat b_hist, g_hist, r_hist;
	int bins_w = 1;//组距为1
	b_hist = calculate_histogram(bgr_plane[0], bins_w);
	g_hist = calculate_histogram(bgr_plane[1], bins_w);
	r_hist = calculate_histogram(bgr_plane[2], bins_w);
	
	//显示直方图
	int hist_w = 400;
	int hist_h = 400;
	int group_num = 256 / bins_w + 256 % bins_w;//组数
	int bin_w = cvRound((double)hist_w / group_num);
	Mat histImg = Mat::zeros(hist_h, hist_w, CV_8UC3);
	//归一化直方图数据
	b_hist = Normalize(b_hist, 0, hist_h);
	g_hist = Normalize(g_hist, 0, hist_h);
	r_hist = Normalize(r_hist, 0, hist_h);

	//绘制直方图曲线
	for (int i = 1; i < group_num; i++)
	{
   
		line(histImg, Point(bins_w*(i - 1), hist_h - cvRound(b_hist.at<float>(i - 1))),
			Point(bins_w*i, hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 2, 8, 0);

		line(histImg, Point(bins_w*(i - 1), hist_h - cvRound(g_hist.at<float>(i - 1))),
			Point(bins_w*i, hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 2, 8, 0);

		line(histImg, Point(bins_w*(i - 1), hist_h - cvRound(r_hist.at<float>(i - 1))),
			Point(bins_w*i, hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值