OpenCV2:小學篇 圖像灰度變換技術-直方圖處理

一.簡介

在一個單通道的灰度圖像中,每一個像素的值介於0(黑色)~255(白色)之間,灰色圖像的直方圖有256個條目(或稱爲容器)spa

 

二.灰度直方圖

圖像由像素點構成,灰度直方圖用來描述圖像中各個灰度級的像素個數(該灰度級像素出現的頻率),灰度直方圖的橫座標表示灰度級,縱座標表示圖像中該灰度級出現的次數(頻率)code

對於灰度圖像,其灰度階256級變換範圍爲0~256orm

 

void calcHist(blog

  const Mat* images,it

  int nimages,opencv

  const int* channels,form

  InputArray mask,class

  OutputArray hist,容器

  int dims,channel

  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直方圖

 

五.自定義直方圖

 

六.灰度直方圖均衡

 

七.彩色直方圖均衡

 

八.直方圖變換查找

 

九.直方圖變換累計

 

十.直方圖匹配

 

十一.直方圖對比

 

 

十二.直方圖反向投影

相關文章
相關標籤/搜索