日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

直方图(opencv)

發布時間:2023/11/27 生活经验 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 直方图(opencv) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、介紹

?圖像直方圖是用一表示數字圖像中亮度分布的直方圖,標繪了圖像中每個亮度值的像素數。可以借助觀察該直方圖了解需要如何調整亮度分布的直方圖。這種直方圖中,橫坐標的左側為純黑、較暗的區域,而右側為較亮、純白的區域。因此,一張較暗圖片的圖像直方圖中的數據多集中于左側和中間部分,而整體明亮、只有少量陰影的圖像則相反。計算機視覺鄰域常借助圖像直方圖來實現圖像的二值化。


二、API函數

C++ Void calcHist(const Mat* images,//輸入圖像指針int images,// 圖像數目const int* channels,// 通道數InputArray mask,// 輸入mask,可選,不用OutputArray hist,//輸出的直方圖數據int dims,// 維數const int* histsize,// 直方圖級數const float* ranges,// 值域范圍bool uniform,// true by defaultbool accumulate)// false by defaut
函數cvRound,cvFloor,cvCeil 都是用一種舍入的方法將輸入浮點數轉換成整數:cvRound():返回跟參數最接近的整數值,即四舍五入;
cvFloor():返回不大于參數的最大整數值,即向下取整;
cvCeil():返回不小于參數的最小整數值,即向上取整;

三、繪制圖像直方圖

1、使用API函數?calcHist計算圖像直方圖;

2、進行直方圖歸一化;

3、繪制各級直方圖;

#include<opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{Mat src, dst;src = imread("1.jpg");cvtColor(src, src, COLOR_BGR2GRAY);int histSize = 16;float range[] = { 0, 256 };const float* histRange = { range };if (src.data && src.channels()==1){cout << "您輸入的是灰度圖像" << endl;Mat hist;calcHist(&src, 1, 0, Mat(), hist, 1, &histSize, &histRange, true, false);//繪制直方圖int hist_w = 512, hist_h = 400;//直方圖中各點x軸距離int distance = cvRound((double)hist_w / histSize);//創建一個圖像以顯示直方圖Mat histImage1(hist_h, hist_w, src.type(), Scalar(255, 255, 255));//歸一化直方圖normalize(hist, hist, 0, hist_h, NORM_MINMAX, -1,Mat());for (int i = 1; i < histSize; i++){// hist_h - cvRound(hist.at<float>(i)):hist.at<float>(i)存儲的值是從圖像//左上角為0開始計算的,所以需要使用hist_h減以后才是坐標軸的縱軸值line(histImage1, Point(distance * (i-1), hist_h - cvRound(hist.at<float>(i-1))),Point(distance * (i), hist_h - cvRound(hist.at<float>(i))),Scalar(0,0,255),2,8,0);}namedWindow("calcHist1", WINDOW_AUTOSIZE);imshow("calcHist1", histImage1);}else if (src.data && src.channels() == 3){cout << "您輸入的是彩色圖像" << endl;vector<Mat> mv;split(src, mv);Mat b_hist, g_hist, r_hist;calcHist(&mv[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, true, false);calcHist(&mv[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, true, false);calcHist(&mv[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, true, false);// 繪制直方圖int hist_w = 512,hist_h = 400;int distance = cvRound((double)hist_w / histSize);Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(255, 255, 255));normalize(b_hist, b_hist, 0, hist_h, NORM_MINMAX, -1, Mat());normalize(g_hist, g_hist, 0, hist_h, NORM_MINMAX, -1, Mat());normalize(r_hist, r_hist, 0, hist_h, NORM_MINMAX, -1, Mat());for (int i = 1; i < histSize; i++){//line(histImage, Point(distance * (i - 1), hist_h - cvRound(b_hist.at<float>(i - 1))),Point(distance * (i), hist_h - cvRound(b_hist.at<float>(i))),Scalar(255, 0, 0), 2, 8, 0);line(histImage, Point(distance * (i - 1), hist_h - cvRound(g_hist.at<float>(i - 1))),Point(distance * (i), hist_h - cvRound(g_hist.at<float>(i))),Scalar(0, 255, 0), 2, 8, 0);line(histImage, Point(distance * (i - 1), hist_h - cvRound(r_hist.at<float>(i - 1))),Point(distance * (i), hist_h - cvRound(r_hist.at<float>(i))),Scalar(0, 0, 255), 2, 8, 0);}namedWindow("calcHist", WINDOW_AUTOSIZE);imshow("calcHist", histImage);}else{cout << "您未輸入圖像" << endl;return -1;}waitKey(0);return 0;
}

四、直方圖比較

  1. 為了比較兩個直方圖(?H1?和?H2?),首先我們必須選擇度量(?d(H1,H2)來表示兩個直方圖的匹配度。
  2. OpenCV實現函數cv :: compareHist進行比較。它還提供4種不同的指標來計算匹配:
  • 相關性(CV_COMP_CORREL)(1為最相似)

其中:

N是直方圖庫的總數。

  • Chi-Square(CV_COMP_CHISQR)(0為最相似)

  • 交點(method= CV_COMP_INTERSECT)(越大越相似)

  • Bhattacharyya distance ( CV_COMP_BHATTACHARYYA )(0為最相似)

?

*Method*Base - Base
*Correlation*1.000000
*Chi-square*0.000000
*Intersection*24.391548
*Bhattacharyya*0.000000
#include<opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{Mat src, dst;src = imread("12.bmp");namedWindow("原圖", WINDOW_AUTOSIZE);imshow("原圖", src);int histSize = 16;float range[] = { 0, 256 };const float* histRange = { range };if (src.data && src.channels()==1){cout << "您輸入的是灰度圖像" << endl;Mat hist;calcHist(&src, 1, 0, Mat(), hist, 1, &histSize, &histRange, true, false);//繪制直方圖int hist_w = 512, hist_h = 400;//直方圖中各點x軸距離int distance = cvRound((double)hist_w / histSize);//創建一個圖像以顯示直方圖Mat histImage1(hist_h, hist_w, src.type(), Scalar(255, 255, 255));//歸一化直方圖normalize(hist, hist, 0, hist_h, NORM_MINMAX, -1,Mat());for (int i = 1; i < histSize; i++){// hist_h - cvRound(hist.at<float>(i)):hist.at<float>(i)存儲的值是從圖像//左上角為0開始計算的,所以需要使用hist_h減以后才是坐標軸的縱軸值line(histImage1, Point(distance * (i-1), hist_h - cvRound(hist.at<float>(i-1))),Point(distance * (i), hist_h - cvRound(hist.at<float>(i))),Scalar(0,0,255),2,8,0);}namedWindow("calcHist1", WINDOW_AUTOSIZE);imshow("calcHist1", histImage1);}else if (src.data && src.channels() == 3){cout << "您輸入的是彩色圖像" << endl;vector<Mat> mv;split(src, mv);Mat b_hist, g_hist, r_hist;calcHist(&mv[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, true, false);calcHist(&mv[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, true, false);calcHist(&mv[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, true, false);// 繪制直方圖int hist_w = 512,hist_h = 400;int distance = cvRound((double)hist_w / histSize);Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(255, 255, 255));normalize(b_hist, b_hist, 0, hist_h, NORM_MINMAX, -1, Mat());normalize(g_hist, g_hist, 0, hist_h, NORM_MINMAX, -1, Mat());normalize(r_hist, r_hist, 0, hist_h, NORM_MINMAX, -1, Mat());for (int i = 1; i < histSize; i++){//line(histImage, Point(distance * (i - 1), hist_h - cvRound(b_hist.at<float>(i - 1))),Point(distance * (i), hist_h - cvRound(b_hist.at<float>(i))),Scalar(255, 0, 0), 2, 8, 0);line(histImage, Point(distance * (i - 1), hist_h - cvRound(g_hist.at<float>(i - 1))),Point(distance * (i), hist_h - cvRound(g_hist.at<float>(i))),Scalar(0, 255, 0), 2, 8, 0);line(histImage, Point(distance * (i - 1), hist_h - cvRound(r_hist.at<float>(i - 1))),Point(distance * (i), hist_h - cvRound(r_hist.at<float>(i))),Scalar(0, 0, 255), 2, 8, 0);}//比較直方圖相似度double similar = compareHist(b_hist, b_hist, CV_COMP_CORREL);cout << similar << endl;namedWindow("calcHist", WINDOW_AUTOSIZE);imshow("calcHist", histImage);}else{cout << "您未輸入圖像" << endl;return -1;}waitKey(0);return 0;
}

?

?

?

?

總結

以上是生活随笔為你收集整理的直方图(opencv)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。