博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算图像直方图(OpenCV内置实现)
阅读量:6373 次
发布时间:2019-06-23

本文共 2263 字,大约阅读时间需要 7 分钟。

hot3.png

记录生活,分享技术!

图像直方图:图像由像素构成,每个有不同数值。对于每个灰度,都有不同数量的像素分布在图像内,具体取决于图片内容。

C++代码如下:

1、头文件

#pragma once

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/video/background_segm.hpp"
#include"opencv2/opencv.hpp"

#include <iostream>

using namespace std;

using namespace cv;

class Histogram1D

{
public:
    Histogram1D();
    ~Histogram1D();

     static Mat getHistogram(const Mat &image);  // 得到梯度直方图的数值

     static Mat getHistogramImage(const cv::Mat &image, int zoom);  // 得到数值,并显示成图像的类型
     static Mat getImageOfHistogram(const Mat &hist, int zoom);  // 画图,上面方法调用

private:
    int histSize[1]; // 直方图中的箱子的数量
    float hranges[2]; // 值范围
    const float* ranges[1];  // 值范围的指针
    int channels[1];  // 要检查的通道数量

};

 

 

2、cpp主文件

#include "Histogram1D.h"

Histogram1D::Histogram1D(){

    // 准备一维直方图的默认参数
    histSize[0] = 256;
    hranges[0] = 0.0;
    hranges[1] = 256.0;
    ranges[0] = hranges;
    channels[0] = 0;
}

Histogram1D::~Histogram1D()
{
}

cv::Mat Histogram1D::getHistogram(const cv::Mat &image){

    cv::Mat hist;
    Histogram1D h1;

    // 计算直方图

    cv::calcHist(&image, 1, h1.channels, cv::Mat(), hist, 1, h1.histSize, h1.ranges);

    return hist;

}

cv::Mat Histogram1D::getHistogramImage(const cv::Mat &image, int zoom = 1){  // 得到数值,并显示成图像的类型

    // 首先计算直方图
    Mat hist = getHistogram(image);

    // 创建图像

    return getImageOfHistogram(hist, zoom);
}

cv::Mat Histogram1D::getImageOfHistogram(const Mat &hist, int zoom){  // 画图,上面方法调用, 直方图图像

    // 取得箱子值得最大值和最小值
    double maxVal = 0;
    double minVal = 0;
    cv::minMaxLoc(hist, &minVal, &maxVal, 0, 0);

    // 取得直方图的大小

    int histSize = hist.rows;

    // 用于显示直方图的方形图像

    cv::Mat histImg(histSize*zoom, histSize*zoom, CV_8U, cv::Scalar(255));
    // 设置最高点为90%(即图像高度)的箱子个数
    int hpt = static_cast<int>(0.9*histSize);
    // 为每个箱子画垂直线
    for (int h = 0; h < histSize; h++){
        float binVal = hist.at<float>(h);
        if (binVal>0)
        {
            int intensity = static_cast<int>(binVal*hpt / maxVal);
            cv::line(histImg, cv::Point(h*zoom, histSize*zoom),
                cv::Point(h*zoom, (histSize - intensity)*zoom),
                cv::Scalar(0), zoom);
        }
    }
    return histImg;

}

3、main函数调用函数

// 直方图对象

    Histogram1D h;
    // 计算并显示直方图
    cv::namedWindow("Histogram");
    cv::imshow("Histogram", h.getHistogramImage(image, 1));

    waitKey(0);

    //system("pause");
    return 0;

 

4、运行结果

234041_2e8x_3702502.png

 

参考:OpenCV计算机视觉编程攻略 (第2版)

 

转载于:https://my.oschina.net/u/3702502/blog/1636170

你可能感兴趣的文章
<中国人聪明之道>读书笔记
查看>>
如何手工释放linux内存
查看>>
Sliverlight好教程
查看>>
从一般管理原则看微软的重组
查看>>
Oracle安装过程物理内存检查及临时temp空间不足解决办法
查看>>
安装wine的问题
查看>>
【如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?】
查看>>
Generative Adversarial Nets[Introduction]
查看>>
mybatis源码解读(四)——事务的配置
查看>>
Android中通过导入静态数据库来提高应用第一次的启动速度
查看>>
Namespacing in PHP (php 中使用命名空间)
查看>>
译:在ASP.NET MVC5中如何使用Apache log4net 类库来记录日志
查看>>
GCD之并行串行区别
查看>>
PHP哈希表碰撞攻击
查看>>
linux根目录下文件夹概览
查看>>
数字在排序数组中出现的次数
查看>>
前端工程化二(requirejs + gulp)
查看>>
jmeter关于录制带中文的get请求回放会报错的问题
查看>>
WPF ViewModel与多个View绑定后如何解决的问题
查看>>
C#使用Xamarin开发可移植移动应用(5.进阶篇显示弹出窗口与通讯中心)附源码
查看>>