// Image_progress_class.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
class Histogram1D
{
public:
Histogram1D(){
//准备1D直方图参数初始化
histSize[0] = 256;
hranges[0] = 0.0;
hranges[1] = 255.0;
ranges[0] = hranges;
channels[0] = 0;
}
MatND getHistogram(const Mat &image)
{
MatND hist;
//计算直方图
calcHist(&image,
1, //计算单张图像的直方图
channels, //通道数
Mat(), //不使用图像作为掩码
hist, //返回直方图
1, //1D直方图
histSize, //项的数量
ranges //项的范围
);
return hist;
}
Mat getHistogramImage(const Mat &image)
{
//首先计算直方图
MatND hist = getHistogram(image);
//获取最大值和最小值
double maxVal = 0;
double minVal = 0;
minMaxLoc(hist, &minVal, &maxVal, 0, 0);
Mat histImg(histSize[0], histSize[0], CV_8U, Scalar(255));
//设置最高点为nbins的90%
int hpt = static_cast<int>(0.9 * histSize[0]);
for (int h = 0; h < histSize[0]; h++)
{
float binVal = hist.at<float>(h);
int intensity = static_cast<int>(binVal * hpt / maxVal);
//绘制垂直直线
line(histImg, Point(h, histSize[0]),
Point(h, histSize[0] - intensity),
Scalar::all(65));
}
return histImg;
}
private:
int histSize[1];//项的数量
float hranges[2];//像素的最大值和最小值
const float* ranges[1];
int channels[1];//一个通道
};
int _tmain(int argc, _TCHAR* argv[])
{
Mat src = imread("D:\\lena.jpg");
imshow("lena", src);
Histogram1D h;
MatND histo = h.getHistogramImage(src);
imshow("HISTO", histo);
//生成二值图像清晰显示了分段的背景与前景
Mat thresholded;
threshold(src, thresholded, 60, 255, THRESH_BINARY);
imshow("thresholded", thresholded);
waitKey();
system("pause");
return 0;
}
OpenCV使用直方图统计像素
猜你喜欢
转载自blog.csdn.net/u014801811/article/details/80342474
今日推荐
周排行