最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ OpenCV繪制簡易直方圖DrawHistImg

 更新時(shí)間:2021年12月09日 10:31:16   作者:翟天保Steven  
本文主要介紹了一個(gè)能繪制簡易直方圖的簡單函數(shù)DrawHistImg,可以幫助大家快速掌握繪制的原理,可以根據(jù)自己的創(chuàng)意對其進(jìn)行改善和補(bǔ)充。需要的朋友可以參考一下

需求說明

在對圖像進(jìn)行處理時(shí),經(jīng)常會有這類需求:想要觀察圖像的直方圖分布,例如灰度圖中0-255區(qū)間數(shù)值的分布情況,從而可以進(jìn)行后續(xù)的操作,如閾值分割二值化、直方圖均衡化等等。本文設(shè)計(jì)了一個(gè)能繪制簡易直方圖的簡單函數(shù)DrawHistImg,可以幫助大家快速掌握繪制的原理,可以根據(jù)自己的創(chuàng)意對其進(jìn)行改善和補(bǔ)充。

下面介紹具體實(shí)現(xiàn)流程。

具體流程

1)取圖像的灰度圖,并遍歷統(tǒng)計(jì)0-255各個(gè)灰度值所出現(xiàn)的次數(shù)。

cv::Mat src = imread("test.jpg", 0);
cv::Mat hist = cv::Mat::zeros(1, 256, CV_32FC1);
for (int i = 0; i < src.rows; ++i)
{
	for (int j = 0; j < src.cols; ++j)
	{
		hist.at<float>(0, src.at <uchar>(i, j))++;
	}
}

2)定義直方圖圖像histImage,并初始化一些參數(shù)。其中bins是數(shù)值最大值,即255;scale為每個(gè)灰度值所對應(yīng)的直方圖寬度;histHeight為直方圖高度最大值,也是直方圖圖像的寬。

cv::Mat histImage = cv::Mat::zeros(540, 1020, CV_8UC1);
const int bins = 255;
int scale = 4;
int histHeight = 540;

3)利用minMaxLoc函數(shù)得出哪個(gè)灰度值的出現(xiàn)次數(shù)最高,為歸一化做準(zhǔn)備。

double maxValue;
cv::Point2i maxLoc;
cv::minMaxLoc(hist, 0, &maxValue, 0, &maxLoc);

4)遍歷hist中每個(gè)灰度值,并根據(jù)其出現(xiàn)次數(shù)繪制直方圖,height是歸一化后的高度。

for (int i = 0; i < bins; i++)
{
	float binValue = (hist.at<float>(i));
	int height = cvRound(binValue * histHeight / maxValue);
	cv::rectangle(histImage, cv::Point(i * scale, histHeight),
		cv::Point((i + 1) * scale - 1, histHeight - height), cv::Scalar(255), -1);
 
}

5)函數(shù)執(zhí)行完畢。?

功能函數(shù)

// 繪制簡易直方圖
cv::Mat DrawHistImg(cv::Mat &src)
{
	cv::Mat hist = cv::Mat::zeros(1, 256, CV_32FC1);
	for (int i = 0; i < src.rows; ++i)
	{
		for (int j = 0; j < src.cols; ++j)
		{
			hist.at<float>(0, src.at <uchar>(i, j))++;
		}
	}
	cv::Mat histImage = cv::Mat::zeros(540, 1020, CV_8UC1);
	const int bins = 255;
	double maxValue;
	cv::Point2i maxLoc;
	cv::minMaxLoc(hist, 0, &maxValue, 0, &maxLoc);
	int scale = 4; 
	int histHeight = 540;
 
	for (int i = 0; i < bins; i++)
	{
		float binValue = (hist.at<float>(i));
		int height = cvRound(binValue * histHeight / maxValue);
		cv::rectangle(histImage, cv::Point(i * scale, histHeight),
			cv::Point((i + 1) * scale - 1, histHeight - height), cv::Scalar(255), -1);
 
	}
	return histImage;
}

C++測試代碼

#include <iostream>
#include <time.h>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
 
cv::Mat DrawHistImg(cv::Mat &hist);
 
int main()
{
	cv::Mat src = imread("test.jpg", 0);
 
	// 繪制均衡化后直方圖
	cv::Mat hrI = DrawHistImg(src);
 
	imshow("original", src);
	imshow("hist", hrI);
	waitKey(0);
 
	return 0;
}
 
 
// 繪制簡易直方圖
cv::Mat DrawHistImg(cv::Mat &src)
{
	cv::Mat hist = cv::Mat::zeros(1, 256, CV_32FC1);
	for (int i = 0; i < src.rows; ++i)
	{
		for (int j = 0; j < src.cols; ++j)
		{
			hist.at<float>(0, src.at <uchar>(i, j))++;
		}
	}
	cv::Mat histImage = cv::Mat::zeros(540, 1020, CV_8UC1);
	const int bins = 255;
	double maxValue;
	cv::Point2i maxLoc;
	cv::minMaxLoc(hist, 0, &maxValue, 0, &maxLoc);
	int scale = 4; 
	int histHeight = 540;
 
	for (int i = 0; i < bins; i++)
	{
		float binValue = (hist.at<float>(i));
		int height = cvRound(binValue * histHeight / maxValue);
		cv::rectangle(histImage, cv::Point(i * scale, histHeight),
			cv::Point((i + 1) * scale - 1, histHeight - height), cv::Scalar(255), -1);
 
	}
	return histImage;
}

測試效果

圖1 原圖

圖2 灰度圖

圖3 直方圖

如果函數(shù)有什么可以改進(jìn)完善的地方,非常歡迎大家指出,一同進(jìn)步何樂而不為呢~?

以上就是C++ OpenCV繪制簡易直方圖DrawHistImg的詳細(xì)內(nèi)容,更多關(guān)于C++ OpenCV繪制直方圖的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一篇文章帶你了解C++智能指針詳解

    一篇文章帶你了解C++智能指針詳解

    這篇文章主要介紹了c++ 智能指針基礎(chǔ)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下,希望能給你帶來幫助
    2021-08-08
  • Qt圖形圖像開發(fā)曲線圖表模塊QChart庫基本用法、各個(gè)類之間的關(guān)系說明

    Qt圖形圖像開發(fā)曲線圖表模塊QChart庫基本用法、各個(gè)類之間的關(guān)系說明

    這篇文章主要介紹了Qt圖形圖像開發(fā)曲線圖表模塊QChart庫基本用法、各個(gè)類之間的關(guān)系說明,需要的朋友可以參考下
    2020-03-03
  • c語言:基于函數(shù)指針的兩個(gè)示例分析

    c語言:基于函數(shù)指針的兩個(gè)示例分析

    本篇文章是對c語言中函數(shù)指針的兩個(gè)示例做了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言中break與continue的用法和區(qū)別詳解

    C語言中break與continue的用法和區(qū)別詳解

    當(dāng)我們使用while或for循環(huán)時(shí),如果想提前結(jié)束循環(huán)(在不滿足結(jié)束條件的情況下結(jié)束循環(huán)),可以使用break或continue關(guān)鍵字,這篇文章主要給大家介紹了關(guān)于C語言中break與continue的用法和區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • C++中的friend友元函數(shù)詳細(xì)解析

    C++中的friend友元函數(shù)詳細(xì)解析

    友元可以是一個(gè)函數(shù),該函數(shù)被稱為友元函數(shù);友元也可以是一個(gè)類,該類被稱為友元類。友元函數(shù)的特點(diǎn)是能夠訪問類中的私有成員的非成員函數(shù)。友元函數(shù)從語法上看,它與普通函數(shù)一樣,即在定義上和調(diào)用上與普通函數(shù)一樣
    2013-09-09
  • C語言中變量與其內(nèi)存地址對應(yīng)的入門知識簡單講解

    C語言中變量與其內(nèi)存地址對應(yīng)的入門知識簡單講解

    這篇文章主要介紹了C語言中變量與其內(nèi)存地址對應(yīng)的入門知識簡單講解,同時(shí)這也是掌握指針部分知識的基礎(chǔ),需要的朋友可以參考下
    2015-12-12
  • C++控制臺用定時(shí)器實(shí)例代碼

    C++控制臺用定時(shí)器實(shí)例代碼

    這篇文章主要介紹了C++控制臺用定時(shí)器實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • C++動態(tài)規(guī)劃之最長公子序列實(shí)例

    C++動態(tài)規(guī)劃之最長公子序列實(shí)例

    這篇文章主要介紹了C++動態(tài)規(guī)劃之最長公子序列,實(shí)例分析了C++求最長公子序列的相關(guān)技巧,是C++字符串操作的一個(gè)典型應(yīng)用,需要的朋友可以參考下
    2015-04-04
  • 手拉手教你如何理解c/c++中的指針

    手拉手教你如何理解c/c++中的指針

    當(dāng)你對C越來越熟悉時(shí),你會發(fā)現(xiàn)把與指針攪和在一起的"類型"這個(gè)概念分成"指針的類型"和"指針?biāo)赶虻念愋?quot;兩個(gè)概念,是精通指針的關(guān)鍵點(diǎn)之一,這篇文章主要給大家介紹了關(guān)于c/c++中指針的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • C++基于OpenCV實(shí)現(xiàn)手勢識別的源碼

    C++基于OpenCV實(shí)現(xiàn)手勢識別的源碼

    這篇文章主要介紹了C++基于OpenCV手勢識別的實(shí)現(xiàn)源碼,這里用到背景減法模型知識,具體實(shí)例代碼跟隨小編一起看看吧
    2021-09-09

最新評論

桂阳县| 内黄县| 祥云县| 上林县| 连云港市| 河东区| 房山区| 墨脱县| 巫溪县| 阿克苏市| 南投市| 明星| 辽阳市| 准格尔旗| 应用必备| 乌兰察布市| 阜宁县| 鄂尔多斯市| 张家口市| 阜康市| 扎鲁特旗| 宾川县| 新沂市| 甘肃省| 西平县| 井陉县| 天津市| 界首市| 马龙县| 定远县| 嘉黎县| 吉水县| 宝应县| 名山县| 元朗区| 赞皇县| 开江县| 库尔勒市| 富锦市| 乐平市| 永善县|