单通道直方图

本文提供了一个简单的C++程序,演示如何使用OpenCV库计算和显示一幅图像的1D直方图。程序从图像中读取数据,计算直方图,并通过绘制线条展示直方图图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于直方图的介绍很多blogs都有讲到,还有一些有交互操作,这里的是一个非常简单的程序,只是基本做到基础功能。程序也是由书本改过来的,就是不明白为什么他要把那些定义private,我直接调试是调不通的,因为少一个}的说,改变位置后面加分号程序又错误。C++学得不扎实,只好把定义放出来了
#include "stdafx.h"
#include <iostream>  
#include<core/core.hpp>  
#include<highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>




using namespace std;
using namespace cv;


int histSize[1];// 项的数量
float hranges[2];//像素的最小及最大值
const float*ranges[1];
int channels[1];//仅用到一个通道 


class Histogram1D {
  /*private :
int histSize[1];// 项的数量
float hranges[2];//像素的最小及最大值
const float*ranges[1];
int channels[1];//仅用到一个通道 */
public :
Histogram1D (){


histSize[0]=256;
hranges[0]=0.0;
hranges[1]=255.0;
ranges[0]=hranges;
channels[0]=0;
}
};


//计算1D直方图
cv::MatND getHistogram (const cv::Mat &image){
cv::MatND hist;
calcHist (&image,1,channels,cv::Mat(),hist,1,histSize,ranges);
return hist;
}


cv::Mat getHistogramImage (const cv::Mat &image)
{
//首先计算直方图
cv::MatND hist =getHistogram(image);
double maxVal=0;
double minVal=0;
minMaxLoc (hist,&minVal,&maxVal,0,0);
cv::Mat histImg (histSize[0],histSize[0],CV_8U,cv::Scalar(255));
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,cv::Point(h,histSize[0]),cv::Point(h,histSize[0]-intensity),cv::Scalar::all(0));
}
return histImg;
}



int _tmain(int argc, _TCHAR* argv[])
{
/* Mat image= imread ("IMG_20170329_155039.jpg");
if (!image.data) 
{
cout<<"Cannot load the image"<<endl;
return -1;
}
int cols=image.cols;
int rows=image.rows;
Mat imageROI;
imageROI=image (cv::Rect(cols/4,rows*0.6,720,720));
cv::imwrite ("cutroi.jpg",imageROI);
cv::imshow("CUT",imageROI);   */


Mat im=imread("cutroi.jpg",0);//以黑白模式打开
Histogram1D h;               //histogram 对象
imshow ("Histogram",getHistogramImage(im));
waitKey ();
system ("pause");  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值