Opencv一維直方圖的繪制

下面是我參考《opencv3編程入門》寫的繪制一維直方圖的代碼

using namespace cv;
using namespace std;
#define byte uchar 
#define TYEPE_GRAY 0
#define TYEPE_RGB 1
/*--------------------------繪制RGB三色一維直方圖-------------------------------------*/
Mat My_Rraw_histogram(Mat* srcImage,int type)  //輸入:要處理的灰度圖   輸出:該圖像的直方圖
{if (type == TYEPE_GRAY)  //一維灰度直方圖繪制{//【1】將原圖轉化為灰度圖Mat gray_srcImage;cvtColor(*srcImage,gray_srcImage, COLOR_BGR2GRAY);//【2】定義變量MatND dstHist;int dims = 1;  //需要計算的直方圖的維數float grayranges[] = { 0,255 };const float* ranges[] = { grayranges }; //這里需要為const類型int size = 256;   //表示的是將統計的灰度值分成的等份int Height = 256;int channels = 0; //灰度圖只有一個0通道//【3】計算圖像直方圖calcHist(srcImage, //輸入數組1, //數組個數&channels, //通道索引Mat(),//不使用掩膜dstHist, //輸出的目標直方圖dims, //需要計算的直方圖的維數&size, //存放每個維度的直方圖尺寸的數組ranges); //每一維數值的取值范圍 int scale = 1;  //scale 每一個像素占的格數Mat dstImage(size * scale, size, CV_8U, Scalar(0));  //長 :size*scale ,寬:size ,值為0//【4】獲取最大值和最小值double minVal = 0;double maxVal = 0;minMaxLoc(dstHist, &minVal, &maxVal, 0, 0);  //獲得直方圖中最大值和最小值//【5】繪制出直方圖int hpt = saturate_cast<int>(0.9 * Height);   //saturate_cast 是溢出保護    大概意思 :if(data<int的負范圍)  data = 負最大; else if (data > int的正范圍) data = int 正最大;for (int i = 0;i < 256;i++){float binVal = dstHist.at<float>(i);int realVal = saturate_cast<int>(binVal * hpt / maxVal);  //在圖像上的高度 = 像素數目/像素值最大數目 * 0.9*256   這里0.9是為了削減圖像像素高度,因為最大的時候會觸及頂端不美觀rectangle(dstImage, Point(i * scale, Height - 1), Point((i + 1) * scale - 1, Height - realVal), Scalar(255));//要進行繪制的目標圖像 矩形的左下頂點 矩陣對角線上的右上頂點 線條的顏色(RGB)或亮度(灰度圖)  一共要繪制256個矩形}return dstImage;}else if (type == TYEPE_RGB){//【1】定義變量MatND redHist,greenHist,blueHist;int dims = 1;		//需要計算的直方圖的維數float grayranges[] = { 0,256 };const float* ranges[] = { grayranges };	//這里需要為const類型int size = 256;			//表示的是將統計的灰度值分成的等份int channels_r[] = { 2 };	int channels_g[] = { 1 };	int channels_b[] = { 0 };	//疑問 : RGB圖像的R、G、B是對應channel[0]、channel[1]、channel[2]還是對應channel[2]、channel[1]、channel[0] ?//經過驗證是channel[2]、channel[1]、channel[0]//【2】計算圖像直方圖//--------------------red--------------------------calcHist(srcImage,	//輸入數組1,	//數組個數channels_r,	//通道索引Mat(),//不使用掩膜redHist,	//輸出的目標直方圖dims,	//需要計算的直方圖的維數&size,	//存放每個維度的直方圖尺寸的數組ranges,//每一維數值的取值范圍	true,//指示直方圖是否均勻的標識符,true表示均勻的直方圖false);	//累計標識符,false表示直方圖在配置階段會被清零//--------------------green--------------------------calcHist(srcImage,	//輸入數組1,	//數組個數channels_g,	//通道索引Mat(),//不使用掩膜greenHist,	//輸出的目標直方圖dims,	//需要計算的直方圖的維數&size,	//存放每個維度的直方圖尺寸的數組ranges,//每一維數值的取值范圍	true,//指示直方圖是否均勻的標識符,true表示均勻的直方圖false);	//累計標識符,false表示直方圖在配置階段會被清零//--------------------blue--------------------------calcHist(srcImage,	//輸入數組1,	//數組個數channels_b,	//通道索引Mat(),//不使用掩膜blueHist,	//輸出的目標直方圖dims,	//需要計算的直方圖的維數&size,	//存放每個維度的直方圖尺寸的數組ranges,//每一維數值的取值范圍	true,//指示直方圖是否均勻的標識符,true表示均勻的直方圖false);	//累計標識符,false表示直方圖在配置階段會被清零//【3】獲取最大值和最小值double minVal_r = 0, minVal_g = 0, minVal_b = 0;double maxVal_r = 0, maxVal_g = 0,maxVal_b = 0;minMaxLoc(redHist, &minVal_r, &maxVal_r, 0, 0);		//獲得r直方圖中最大值和最小值minMaxLoc(greenHist, &minVal_g, &maxVal_g, 0, 0);		//獲得g直方圖中最大值和最小值minMaxLoc(blueHist, &minVal_b, &maxVal_b, 0, 0);		//獲得b直方圖中最大值和最小值int scale = 1;		//scale 每一個像素占的格數int Height = 256;	//直方圖高度Mat dstImage(Height, size*3, CV_8UC3, Scalar(0,0,0));		//長 :size*scale ,寬:size*3 ,值為0  將三個直方圖橫放在一起//【4】繪制出直方圖int hpt = saturate_cast<int>(0.9 * Height);			//saturate_cast 是溢出保護    大概意思 :if(data<int的負范圍)  data = 負最大; else if (data > int的正范圍) data = int 正最大;for (int i = 0;i < 256;i++){float binVal_r = redHist.at<float>(i);float binVal_g = greenHist.at<float>(i);float binVal_b = blueHist.at<float>(i);//疑問:是否存在一張圖片中maxVal_r or maxVal_g or maxVal_b 有一個值為0?這樣算出來的值將會是0/0, 而實際值應該是 0int intensityl_r = saturate_cast<int>(binVal_r * hpt / maxVal_r);		//在圖像上的高度 = 像素數目/像素值最大數目 * 0.9*256   這里0.9是為了削減圖像像素高度,因為最大的時候會觸及頂端不美觀int intensityl_g = saturate_cast<int>(binVal_g * hpt / maxVal_g);int intensityl_b = saturate_cast<int>(binVal_b * hpt / maxVal_b);rectangle(dstImage, Point(i * scale, Height - 1), Point((i + 1) * scale - 1, Height - intensityl_r), Scalar(0,0,255));rectangle(dstImage, Point((i+size)* scale, Height - 1), Point((i + size + 1)* scale - 1, Height - intensityl_g), Scalar(0,255,0));rectangle(dstImage, Point((i + 2*size)* scale, Height - 1), Point((i + 2*size + 1)* scale - 1, Height - intensityl_b), Scalar(255,0,0));//要進行繪制的目標圖像 矩形的左下頂點 矩陣對角線上的右上頂點 線條的顏色(RGB)或亮度(灰度圖)  一共要繪制256個矩形}return dstImage;} 
else{}
}
//主函數
int main()
{//【1】載入原圖Mat srcImage = imread("D:\\opencv_picture_test\\RGB純色圖\\red.jpg", 2|4);			//原圖//Mat srcImage = imread("D:\\opencv_picture_test\\JQ\\JQ14.jpg", 2 | 4);			//原圖namedWindow("原圖", WINDOW_NORMAL);//WINDOW_NORMAL允許用戶自由伸縮窗口imshow("原圖", srcImage);if (srcImage.empty()){printf("Could not find the image!\n");return -1;}Mat dstImage = My_Rraw_histogram(&srcImage, TYEPE_RGB);namedWindow("一維直方圖", WINDOW_NORMAL);//WINDOW_NORMAL允許用戶自由伸縮窗口imshow("一維直方圖", dstImage);waitKey(0);return 0;
}

下面是代碼實現的效果
原圖純紅
一維直方圖
純紅時,cahnnel【2】值為255的像素個數最多,其他為0,channel【1】和channel【0】值為0的像素個數最多,其他為0。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378765.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378765.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378765.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java類class forName()方法及示例

類類forName()方法 (Class class forName() method) forName() method is available in java.lang package. forName()方法在java.lang包中可用。 forName() method is used to return the class object for the Class with the given class_name. forName()方法用于返回具有給…

04-圖像的閾值操作

對圖像的閾值操作 import cv2 import matplotlib.pyplot as pltimg cv2.imread(E:/Jupyter_workspace/study/data/cat.png,1) ret, thresh1 cv2.threshold(img,127,255,cv2.THRESH_BINARY) ret, thresh2 cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV) ret, thresh3 c…

java虛擬機內存監控_深入理解JVM虛擬機9:JVM監控工具與診斷實踐

本文轉自&#xff1a;https://juejin.im/post/59e6c1f26fb9a0451c397a8c本系列文章將整理到我在GitHub上的《Java面試指南》倉庫&#xff0c;更多精彩內容請到我的倉庫里查看https://github.com/h3pl/Java-Tutorial喜歡的話麻煩點下Star哈文章將同步到我的個人博客&#xff1a;…

詳解:數據庫名、實例名、ORACLE_SID、數據庫域名、全局數據庫名、服務名

數據庫名、實例名、數據庫域名、全局數據庫名、服務名&#xff0c;這是幾個令很多初學者容易混淆的概念。相信很多初學者都與我一樣被標題上這些個概念搞得一頭霧水。我們現在就來把它們弄個明白。 一、數據庫名什么是數據庫名&#xff1f;數據庫名就是一個數據庫的標識&#…

顏色縮減 -利用指針、迭代器、動態地址實現訪問像素

為什么要使用顏色縮減 在對單通道圖像進行處理時&#xff0c;像素的可能值為256個&#xff0c;但處理多通道時&#xff0c;像素的處理就會相當麻煩&#xff0c;其實用這些顏色中具有代表性的一小部分就可以達到同樣的效果&#xff0c;所以顏色空間縮減就可以派上用場了。一個信…

setlenient_Java日歷setLenient()方法與示例

setlenient日歷類setLenient()方法 (Calendar Class setLenient() method) setLenient() method is available in java.util package. setLenient()方法在java.util包中可用。 setLenient() method is used to set or unset lenient status of date or time interpretations. s…

PowerShell_9_零基礎自學課程_9_高級主題:靜態類和類的操作

哈哈&#xff0c;昨天弄了個ubuntu 11.10在虛擬機上運行&#xff0c;發現11.10界面非常絢麗&#xff0c;但是其需要的系統資源非常多&#xff0c;我虛擬機設定內存為512M&#xff0c;1個CPU4個核心&#xff0c; 進入以后發現根本動不了&#xff0c;因此今天我就下載了一個Fedor…

05-圖像的平滑處理(不同的濾波操作)

對圖像進行平滑處理實則就是對圖像進行濾波操作罷了 每張圖片都有若干個像素點所構成&#xff0c;濾波操作上就是將照片上的某些部分像素點進行修改從而達到平滑的效果 先展示一下原圖 import cv2 img cv2.imread(E:\Jupyter_workspace\study\data/test1.png)cv2.imshow(te…

js刪除mysql記錄_(DELETEUPDATE)修改、刪除數據記錄_MySQL

有時&#xff0c;希望除去某些記錄或更改它們的內容。DELETE 和 UPDATE 語句令我們能做到這一點。用update修改記錄UPDATE tbl_name SET 要更改的列WHERE 要更新的記錄這里的 WHERE 子句是可選的&#xff0c;因此如果不指定的話&#xff0c;表中的每個記錄都被更新。例如&#…

C++設計模式之Abstract Factory模式

一、功能   提供一個創建一系列相關或相互依賴對象的接口&#xff0c;而無需指定它們具體的類。 二、結構圖類廠最基本的結構示意圖如下&#xff1a; 在實際應用中&#xff0c;類廠模式可以擴充到很復雜的情況&#xff0c;如下圖所示&#xff1a; 三、優缺點 優點&#xff1…

數字圖像處理小練習存檔1

小練習的題目&#xff1a; 1、讀取一張圖&#xff0c;分解RGB三個通道 /************練習1**********************/ int main() {Mat img1 imread("D:\\opencv_picture_test\\miku2.jpg",2|4); //灰度圖if (img1.empty()){printf("Could not find the imag…

UIImage 壓縮

1.改變圖片大小 -(UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize {// Create a graphics image contextUIGraphicsBeginImageContext(newSize);// Tell the old image to draw in this new context, with the desired// new size[image drawInRect:CG…

06-對圖像進行腐蝕操作

形態學中的腐蝕操作一般處理的圖像數據為二值的 cv2.erode(img,kernel,iterations 1) kernel表示拿多大的卷積核去腐蝕 iterations表示迭代次數 可以將一些帶有毛毛的圖像去毛毛化 原圖 import cv2 import numpy as npdef show_photo(name,picture):cv2.imshow(name,picture)…

Java BufferedReader skip()方法與示例

BufferedReader類skip()方法 (BufferedReader Class skip() method) skip() method is available in java.io package. skip()方法在java.io包中可用。 skip() method is used to skip the given number of bytes of characters (n_bytes_of_char) from this BufferedReader. s…

mysql gtid binlog_MySQL之-四步實現BinLog Replication升級為GTIDs Replication的代碼實例

1、將Master和Slave服務器都設置為read-onlymysql>SET global.read_onlyON;2、將Master與Slave服務器都停下來service mysql stop3、開啟GTIDs開啟GTIDs需要在master和slave服務器上都配置gtid-mode,log-bin,log-slave-updates,enforce-gtid-consistency(在MySQL 5.6.9之前是…

【記】瑣碎

1.GIF載入問題:http://www.cnblogs.com/Lewis/archive/2011/01/17/1937066.html 2.正則分段數字&#xff1a; "12345678945612456".replace(new RegExp((\\d)(?(\\d{3})$),ig),"$1,") 其中用到了正則的后則判斷? 3.給legend設定寬度 發現IE下可以 火狐下…

spring對事務的控制 AOP

我解釋一下(* com.evan.crm.service.*.*(..))中幾個通配符的含義&#xff1a; |第一個 * —— 通配 任意返回值類型| |第二個 * —— 通配 包com.evan.crm.service下的任意class| |第三個 * —— 通配 包com.evan.crm.service下的任意class的任意方法| |第四個 .. —— 通配 方…

Opencv實現利用滑動條來調整閾值

#include <opencv2/opencv.hpp> #include <iostream>using namespace cv; using namespace std; #define WINDOW_NAME "【程序窗口】" //為窗口標題定義的宏 //*--------------------------【練習】利用滑動條來調整閾值-----------------------------…

07-對圖像進行膨脹操作

形態學中的膨脹操作即讓照片變得更大&#xff0c;與腐蝕操作互為逆運算 cv2.dilate(erosion,kernel,iterations 1) 第一個參數&#xff1a;圖像對象名稱 第二個參數&#xff1a;卷積核的大小 第三個參數&#xff1a;迭代次數 此時就可與腐蝕操作進行相結合&#xff0c;腐蝕去毛…

Java LocalDate類| parse()方法與示例

LocalDate類parse()方法 (LocalDate Class parse() method) Syntax: 句法&#xff1a; public static LocalDate parse(CharSequence c_seq);public static LocalDate parse(CharSequence c_seq, DateTimeFormatter fmtr);parse() method is available in java.time package. …