1. BGR三通道图像分离
2. 直方图计算
3. 直方图均衡
输出结果:
2. 直方图计算
输出结果:
输出结果:
代码
#include <ostream>
#include <opencv.hpp>
#include <math.h>int main(int argc, char *argv[])
{
/*
本章内容:
1. BGR三通道图像分离
2. 直方图计算
3. 直方图均衡
*/
cv::String fileName = "/home/wang/dev/Image/biuld.jpeg";
cv::String fileName1 = "/home/wang/dev/Image/pingpang.jpeg";
cv::Mat src = cv::imread(fileName);
if(src.data == NULL){
printf("图像读入失败\n");
return -1;
}
std::vector<cv::Mat> BGRArray;
/* 1. BGR三通道图像分离
api接口: CV_EXPORTS_W void split(InputArray m, OutputArrayOfArrays mv);
@param mv output vector of arrays; // 矩阵向量容器
*/
cv::split(src,BGRArray);
cv::imshow("src", src);
cv::imshow("Blue gray", BGRArray[0]);
cv::imshow("Green gray", BGRArray[1]);
cv::imshow("Red gray", BGRArray[2]);/*1.直方图计算
api接口: CV_EXPORTS void calcHist( const Mat* images, int nimages,
const int* channels, InputArray mask,
OutputArray hist, int dims, const int* histSize,
const float** ranges, bool uniform = true, bool accumulate = false );
注:直方图参数过于复杂,不需要进行高效统计时,直接采用官方给定统计统计灰度直方图即可
*/
cv::Mat r_hist;
cv::Mat g_hist;
cv::Mat b_hist;
int histSize = 255; // 设计Bin
float range[] = { 0, 255 } ; // 设定数值取值方位
const float* histRange = { range };
cv::calcHist( &BGRArray[0], 1, 0, cv::Mat(), b_hist, 1, &histSize, &histRange);
cv::calcHist( &BGRArray[1], 1, 0, cv::Mat(), g_hist, 1, &histSize, &histRange);
cv::calcHist( &BGRArray[2], 1, 0, cv::Mat(), r_hist, 1, &histSize, &histRange);
std::cout << "r_hist.size()" << r_hist.size() << std::endl;
std::cout << "g_hist.size()" << g_hist.size() << std::endl;
std::cout << "b_hist.size()" << b_hist.size() << std::endl;
//绘制直方图
/*
CV_EXPORTS_W void normalize( InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,
int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
*/
int maxV = 255;
cv::Mat histImage(histSize,maxV,CV_8UC3);
cv::normalize(r_hist, r_hist, histImage.rows*2);
cv::normalize(g_hist, g_hist, histImage.rows*2);
cv::normalize(b_hist, b_hist, histImage.rows*2);for(int i=0; i<histSize-1; i++){
cv::line(histImage,cv::Point(i,maxV-r_hist.at<float>(i)),cv::Point(i,maxV-r_hist.at<float>(i+1)),cv::Scalar(0,0,255),4); // 绘制红色通道
cv::line(histImage,cv::Point(i,maxV-g_hist.at<float>(i)),cv::Point(i,maxV-g_hist.at<float>(i+1)),cv::Scalar(0,255,0),4); // 绘制绿色通道
cv::line(histImage,cv::Point(i,maxV-b_hist.at<float>(i)),cv::Point(i,maxV-b_hist.at<float>(i+1)),cv::Scalar(255,0,0),4); // 绘制蓝色通道
}
cv::imshow("hist", histImage);/* 3.直方图均衡
CV_EXPORTS_W void equalizeHist( InputArray src, OutputArray dst );
@param src Source 8-bit single channel image.
@param dst Destination image of the same size and type as src .
*/
cv::Mat dst;
cv::Mat gray;
cv::cvtColor(src,gray,cv::COLOR_BGR2GRAY);
cv::equalizeHist(gray,dst); // 直方图均衡画
cv::imshow("gray",gray);
cv::imshow("equalizeHist",dst);cv::waitKey(0); return 1; }