您的位置:首页 > 运维架构

OpenCV绘制图像的水平和竖直方向直方图

2015-09-02 12:19 381 查看
OpenCV中有求图像颜色直方图的函数,但是没有沿坐标轴的水平直方图统计的函数。
在实验室作项目的过程中,有时需要统计X,Y轴方向的水平直方图,通过水平直方图来寻找图像的阶跃点,写了一段代码与大家共享,水平有限,望大家指正。

编译平台:VS2010+OpenCV2.4.4

下面是求y轴直方图的一段代码:


#define imageshow 1
std::vector<unsigned int> pixel_sum;
std::vector<unsigned int> row_num;
//提取竖直方向直方图
unsigned int sum=0;
for(unsigned int j=0;j<image.size().height;j++)
{
sum=0;
for(unsigned int i=0;i<image.size().width;i++)
{
//这里特别注意at的第一个点是y坐标,第二个点才是横坐标
sum+=bw.at<uchar>(j,i);
}
pixel_sum.push_back(sum);//每行的像素值和存储
row_num.push_back(j);//行号存储
}
#if imageshow
//画直方图,背景应该是白的,直方图是黑的才对
unsigned int hist_height=300;
cv::Mat hist_img(hist_height,row_num.size(),CV_8U,cv::Scalar(255));
//获取最大值和最小值
double maxVal=0;
double minVal=0;
//cv::minMaxLoc(pixel_sum,&minVal,&maxVal,0,0);
maxVal=pixel_sum[0];
for(unsigned int i=0;i<pixel_sum.size();i++)
{
if(pixel_sum[i]>maxVal)
maxVal=pixel_sum[i];
}
unsigned int hpt=static_cast<unsigned int>(hist_height*0.9);//设置直方图绘制的最高点

for(unsigned int i=0;i<pixel_sum.size();i++)
{
unsigned int intensity=static_cast<unsigned int>(pixel_sum[i]/maxVal*hpt);
//两点之间绘制一条直线
cv::line(hist_img,cv::Point(i,hist_height),
cv::Point(i,hist_height-intensity),
cv::Scalar::all(0));
}

cv::namedWindow("hist_img",CV_WINDOW_AUTOSIZE);
cv::imshow("hist_img",hist_img);
cv::waitKey(0);
#endif


试验中要统计y轴感兴趣区域的亮点分布,对一幅二值化图像做了直方图统计:

二值化后图像:



直方图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: