计算图像的直方图(从零开始实现)
一、算法流程
实现彩色图像的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,