B通道的值存在突变,上面的是自己写的,下面的是用calcHist函数的得到的
#include <opencv2/dnn.hpp>
#include <opencv2/dnn/shape_utils.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat srcImage = imread("E:\\Desktop\\0A.jpg");
cvtColor(srcImage, srcImage, COLOR_BGR2RGB);
vector<int> sum_R(256);
vector<int> sum_G(256);
vector<int> sum_B(256);
int srcImage_R, srcImage_G, srcImage_B;
double maxValue_red = 0.0;
double maxValue_green = 0.0;
double maxValue_blue = 0.0;
for (int i = 0; i < srcImage.rows; i++)
for (int j = 0; j < srcImage.cols; j++)
{
srcImage_R = srcImage.at<Vec3b>(i, j)[0];
srcImage_G = srcImage.at<Vec3b>(i, j)[1];
srcImage_B = srcImage.at<Vec3b>(i, j)[2];
sum_R[srcImage_R] = sum_R[srcImage_R] + 1;
sum_G[srcImage_G] = sum_G[srcImage_G] + 1;
sum_B[srcImage_B] = sum_B[srcImage_B] + 1;
if (maxValue_red < sum_R[srcImage_R])
maxValue_red = sum_R[srcImage_R];
if (maxValue_green < sum_G[srcImage_G])
maxValue_green = sum_G[srcImage_G];
if (maxValue_blue < sum_B[srcImage_B])
maxValue_blue = sum_B[srcImage_B];
}
int scale = 256;
double rate_red = (scale / maxValue_red) * 0.9;
double rate_green = (scale / maxValue_green) * 0.9;
double rate_blue = (scale / maxValue_blue) * 0.9;
printf("maxValue_red = %f, maxValue_green = %f, maxValue_blue = %f\n", maxValue_red, maxValue_green, maxValue_blue);
Mat dstImage_temp = Mat::zeros(scale, scale, CV_8UC3);
Mat dstImage(dstImage_temp.size(), dstImage_temp.type(), Scalar(255, 255, 255));//全白图
vector<Point> point_red;
vector<Point> point_green;
vector<Point> point_blue;
for (int i = 0; i < 256; i++)
{
Point point_temp_red = Point(i, scale - sum_R[i] * rate_red);
point_red.push_back(point_temp_red);
Point point_temp_green = Point(i, scale - sum_G[i] * rate_green);
point_green.push_back(point_temp_green);
Point point_temp_blue = Point(i, scale - sum_B[i] * rate_blue);
point_blue.push_back(point_temp_blue);
}
polylines(dstImage, point_red, false, Scalar(0, 0, 255), 1, 8, 0);
polylines(dstImage, point_green, false, Scalar(0, 255, 0), 1, 8, 0);
polylines(dstImage, point_blue, false, Scalar(255, 0, 0), 1, 8, 0);
line(dstImage, Point(0, scale*0.5), Point(5, scale*0.5), Scalar(0, 0, 0));
line(dstImage, Point(85, scale), Point(85, scale - 5), Scalar(0, 0, 0));
line(dstImage, Point(170, scale), Point(170, scale - 5), Scalar(0, 0, 0));
line(dstImage, Point(255, scale), Point(255, scale - 5), Scalar(0, 0, 0));
imshow("srcImage", srcImage);
imshow("图像RGB直方图", dstImage);
waitKey(0);
return 0;
}