• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 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;
    }
    
    版權聲明:本文為weixin_41405284原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_41405284/article/details/105928761

    智能推薦

    Opencv一維直方圖的繪制

    下面是我參考《opencv3編程入門》寫的繪制一維直方圖的代碼 下面是代碼實現的效果 純紅時,cahnnel【2】值為255的像素個數最多,其他為0,channel【1】和channel【0】值為0的像素個數最多,其他為0。...

    使用Opencv繪制灰度直方圖/對比

    一.所需結構體 結構體原型: 二.所需函數 1.cvCalcHist: 函數功能:用于計算圖像直方圖 函數原型: 參數介紹: 返回值:無 2.CvCreateHist: 函數功能:用于創建直方圖 函數原型: 參數介紹: 返回值:成功返回一個指向堆中CvHistogram結構體的CvHistogram指針 3.cvGetMinMaxHistValue: 函數功能:用于統計直方圖中最小值和最大值 函數...

    opencv 繪制圖像直方圖

    為圖像繪制直方圖,效果圖如下: 代碼如下:...

    OpenCV python 繪制圖片直方圖

    OpenCV python 繪制圖片直方圖 處理圖片[source.jpg] 處理結果:...

    猜你喜歡

    opencv(18)---直方圖計算以及繪制

    基本概念 直方圖是對數據進行統計的一種方法, 可以直觀表現圖像某屬性的數值(頻率)分布情況, 包括灰度直方圖、RGB直方圖等 數字直方圖 圖像直方圖 相關概念 函數原型 1.dims: 需要統計得特征的數目, 只統計灰度值—dims=1 統計RGB值—dims=3 2.bins: 每個特征空間子區域段的數目,也 可稱為組距(簡單理解為直方圖分 成幾個柱子組成) 3.rang...

    (Python+OpenCV)繪制灰度直方圖

    繪制單通道直方圖和RGB三通道直方圖。   IDE:Jupyter Lab   原圖: 對原圖進行降維: 直方圖: RGB三通道直方圖:...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    精品国产乱码久久久久久蜜桃不卡