?Opencv,C++环境下
初学,如有问题,可及时沟通交流
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void hist(Mat& src,int h,int w)
{
int rows=src.rows;//图像的高
int cols=src.cols;//图像的宽
int N=rows*cols;//图像的大小
long src_count[256];//每个像素对应的个数
memset(src_count,0,sizeof(src_count));//对数组进行初始化为0
//计算像素对应的个数
for(int i=0;i<rows;i++)
{
uchar*p=src.ptr<uchar>(i);
for(int j=0;j<cols;j++)
{
for(int k=0;k<256;k++)
{
if((int)p[j]==k)
{
src_count[k]++;
}
}
}
}
//h //直方图的高
//w //直方图的宽
Mat src_hist = Mat::zeros(h, w, CV_8UC3);//直方图初始化
int c_max = 0;
int c_min = 10000000;
//比较每个像素对应个数得最大值,最小值
for (int k = 0; k < 256; k++)
{
c_min = (c_min <= src_count[k]) ? c_min : src_count[k];
c_max = (c_max >= src_count[k]) ? c_max : src_count[k];
}
//将像素个数的大小,(缩放)自适应至直方图的高
for (int k = 0; k < 256; k++)
{
src_count[k] = h * (src_count[k] - c_min) / (c_max - c_min);
}
//将0-255(缩放)自适应至直方图的宽
int x[256];
for (int i = 0; i < 256; i++)
{
x[i] = w * i / 255;
}
//在直方图中画线
for (int i = 0; i < 255; i++)
{
line(src_hist, Point(x[i], h - src_count[i]), Point(x[i + 1], h - src_count[i + 1]),Scalar(0,255,0), 1, LINE_AA);
}
//输出直方图
imshow("src_hist_512*512", src_hist);
}
int main()
{
Mat src=imread("Lena.jpg",0);
imshow("src_512*512",src);
hist(src,512,512);
waitKey(0);
return 0;
}
?
|