opencv_25直方圖繪制
標簽: opencv
1.上一篇博客講了直方圖的概念
- 直方圖不只是對圖像灰度值的統計,也可以對圖像的梯度,像素角度等屬性進行統計。
- API
- 首先要拆分通道,將BGR圖像拆分,每個通道范圍{0-255}
split(
//不多通道的圖像拆分為多個單通道
Mat 輸入圖像,
Mat 輸出多通道數組
)
- 訪問不同通道輸入數組指針 bgr_split[int]
vector<Mat> bgr_split;
split(src, bgr_split);
計算直方圖
calcHist(
Mat*輸入圖像指針,
int 圖像數目,
int 通道數, (img.channels-1)
Mat(),
輸出直方圖Mat,
int 維數,//灰度圖維度為1
binsize ,//直方圖級數[0-255]
const *range//直方圖值域范圍
)
int histSize = 256;
float range[]= { 0,256 };
const float *histRange = { range };
Mat b_hist, g_hist, r_hist;
calcHist(&bgr_split[0], 1, 0,Mat(), b_hist, 1, &histSize, &histRange, true, false);
calcHist(&bgr_split[1], 1, 0, Mat(),g_hist, 1, &histSize, &histRange, true, false);
calcHist(&bgr_split[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, true, false);
- 歸一化
1.在通一個灰度值可能出現多個像素點,超過直方圖的高
normalize(
輸入直方圖,
輸出直方圖Mat,
最小值,
最大值,
NORM_MINMAX,
-1,
Mat()
)
normalize(b_hist, b_hist, 0, hist_h, NORM_MINMAX, -1,Mat());//將圖像的高歸一化到0-400之間
normalize(g_hist, g_hist, 0, hist_h, NORM_MINMAX, -1, Mat());//將圖像的高歸一化到0-400之間
normalize(r_hist, r_hist, 0, hist_h, NORM_MINMAX, -1, Mat());//將圖像的高歸一化到0-400之間
- 繪制直方圖
line(
待繪制的圖像矩陣,
線段起點,
線段終點,
顏色,
線寬,
線型
)
- 連接直方圖每個bins的左角點
for (int i = 1; i < histSize; i++)
{
line(histImage, Point((i - 1)*bin_w, hist_h - cvRound(b_hist.at<float>(i - 1))),
Point((i)*bin_w, hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 2, LINE_AA);
line(histImage, Point((i - 1)*bin_w, hist_h - cvRound(g_hist.at<float>(i - 1))),
Point((i)*bin_w, hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 2, LINE_AA);
line(histImage, Point((i - 1)*bin_w, hist_h - cvRound(r_hist.at<float>(i - 1))),
Point((i)*bin_w, hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 255), 2, LINE_AA);
}
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;
int main()
{
Mat src = imread("C:\\Users\\Administrator\\Pictures\\Saved Pictures\\timg6ZAGKYHR.jpg");
if (src.empty())
{
printf("ould not find image \n");
return -1;
}
namedWindow("opencv set up demo", WINDOW_AUTOSIZE);
imshow("opencv set up demo", src);
vector<Mat> bgr_split;
split(src, bgr_split);
//計算直方圖
int histSize = 256;
float range[]= { 0,256 };
const float *histRange = { range };
Mat b_hist, g_hist, r_hist;
calcHist(&bgr_split[0], 1, 0,Mat(), b_hist, 1, &histSize, &histRange, true, false);
calcHist(&bgr_split[1], 1, 0, Mat(),g_hist, 1, &histSize, &histRange, true, false);
calcHist(&bgr_split[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, true, false);
int hist_h = 400;
int hist_w = 512;
int bin_w = hist_w / histSize;
//構建直方圖圖像
Mat histImage(hist_w, hist_h, CV_8UC3, Scalar(0, 0, 0));
//歸一化
normalize(b_hist, b_hist, 0, hist_h, NORM_MINMAX, -1,Mat());//將圖像的高歸一化到0-400之間
normalize(g_hist, g_hist, 0, hist_h, NORM_MINMAX, -1, Mat());//將圖像的高歸一化到0-400之間
normalize(r_hist, r_hist, 0, hist_h, NORM_MINMAX, -1, Mat());//將圖像的高歸一化到0-400之間
//繪制直方圖
for (int i = 1; i < histSize; i++)
{
line(histImage, Point((i - 1)*bin_w, hist_h - cvRound(b_hist.at<float>(i - 1))),
Point((i)*bin_w, hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 2, LINE_AA);
line(histImage, Point((i - 1)*bin_w, hist_h - cvRound(g_hist.at<float>(i - 1))),
Point((i)*bin_w, hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 2, LINE_AA);
line(histImage, Point((i - 1)*bin_w, hist_h - cvRound(r_hist.at<float>(i - 1))),
Point((i)*bin_w, hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 255), 2, LINE_AA);
}
imshow("split", histImage);
waitKey(0);
return 1;
}
智能推薦
Opencv一維直方圖的繪制
下面是我參考《opencv3編程入門》寫的繪制一維直方圖的代碼 下面是代碼實現的效果 純紅時,cahnnel【2】值為255的像素個數最多,其他為0,channel【1】和channel【0】值為0的像素個數最多,其他為0。...
使用Opencv繪制灰度直方圖/對比
一.所需結構體 結構體原型: 二.所需函數 1.cvCalcHist: 函數功能:用于計算圖像直方圖 函數原型: 參數介紹: 返回值:無 2.CvCreateHist: 函數功能:用于創建直方圖 函數原型: 參數介紹: 返回值:成功返回一個指向堆中CvHistogram結構體的CvHistogram指針 3.cvGetMinMaxHistValue: 函數功能:用于統計直方圖中最小值和最大值 函數...
猜你喜歡
opencv(18)---直方圖計算以及繪制
基本概念 直方圖是對數據進行統計的一種方法, 可以直觀表現圖像某屬性的數值(頻率)分布情況, 包括灰度直方圖、RGB直方圖等 數字直方圖 圖像直方圖 相關概念 函數原型 1.dims: 需要統計得特征的數目, 只統計灰度值—dims=1 統計RGB值—dims=3 2.bins: 每個特征空間子區域段的數目,也 可稱為組距(簡單理解為直方圖分 成幾個柱子組成) 3.rang...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...