OpenCV2:小学篇 图像灰度变换技术-直方图处理

一.简介

在一个单通道的灰度图像中,每个像素的值介于0(黑色)~255(白色)之间,灰色图像的直方图有256个条目(或称为容器)

 

二.灰度直方图

图像由像素点构成,灰度直方图用来描述图像中各个灰度级的像素个数(该灰度级像素出现的频率),灰度直方图的横坐标表示灰度级,纵坐标表示图像中该灰度级出现的次数(频率)

对于灰度图像,其灰度阶256级变换范围为0~256

 

void calcHist(

  const Mat* images,

  int nimages,

  const int* channels,

  InputArray mask,

  OutputArray hist,

  int dims,

  const int* histSize,

  const float** ranges,

  bool uniform = true,

  bool accumulate = false)

 

 

#include <opencv2\opencv.hpp>


int main()
{

    // 图像源获取及判断
    cv::Mat Image,ImageGray;
    Image = cv::imread("a.jpg");
    if (Image.empty())
        return -1;
    cv::imshow("Image", Image);

    // 转换为灰度图像
    cv::cvtColor(Image, ImageGray, CV_BGR2GRAY);

    // 定义直方图参数
    const int channels[1] = {0};
    const int histSize[1] = {256};
    float pranges[2] = {0, 255};
    const float* ranges[1] = {pranges};
    cv::MatND hist;

    // 计算直方图
    cv::calcHist(&ImageGray, 1, channels, cv::Mat(), hist, 1, histSize, ranges);

    // 初始化画布参数
    int hist_w = 500;
    int hist_h = 500;
    int nHistSize = 255;

    // 区间
    int bin_w = cvRound((double)hist_w / nHistSize);
    cv::Mat histImage(hist_w, hist_h, CV_8UC3, cv::Scalar(0, 0, 0));

    // 将直方图归一化
    normalize(hist, hist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());

    // 在直方图画布上画出直方图
    for (int i = 1; i < nHistSize; i++)
    {
        line(histImage, 
            cv::Point(bin_w * (i - 1),hist_h - cvRound(hist.at<float>(i-1)) ),
            cv::Point(bin_w * (i), hist_h - cvRound(hist.at<float>(i))),
            cv::Scalar(0, 0, 255),
            2,
            8,
            0);
    }

    // 显示直方图
    cv::imshow("histImage", histImage);
    cv::waitKey(0);

    return 0;

}

 

 

 

三.H-S直方图

 

四.RGB直方图

 

五.自定义直方图

 

六.灰度直方图均衡

 

七.彩色直方图均衡

 

八.直方图变换查找

 

九.直方图变换累计

 

十.直方图匹配

 

十一.直方图对比

 

 

十二.直方图反向投影

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-06-25 16:05  言午丶  阅读(351)  评论(0编辑  收藏  举报