国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++ OpenCV繪制簡易直方圖DrawHistImg

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

2022-03-11 13:21翟天保Steven C/C++

本文主要介紹了一個能繪制簡易直方圖的簡單函數DrawHistImg,可以幫助大家快速掌握繪制的原理,可以根據自己的創意對其進行改善和補充。需要的朋友可以參考一下

需求說明

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

下面介紹具體實現流程。

 

具體流程

1)取圖像的灰度圖,并遍歷統計0-255各個灰度值所出現的次數。

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,并初始化一些參數。其中bins是數值最大值,即255;scale為每個灰度值所對應的直方圖寬度;histHeight為直方圖高度最大值,也是直方圖圖像的寬。

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

3)利用minMaxLoc函數得出哪個灰度值的出現次數最高,為歸一化做準備。

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

4)遍歷hist中每個灰度值,并根據其出現次數繪制直方圖,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)函數執行完畢。 

 

功能函數

// 繪制簡易直方圖
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;
}

 

測試效果

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

圖1 原圖

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

圖2 灰度圖

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

圖3 直方圖

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

以上就是C++ OpenCV繪制簡易直方圖DrawHistImg的詳細內容,更多關于C++ OpenCV繪制直方圖的資料請關注服務器之家其它相關文章!

原文鏈接:https://blog.csdn.net/zhaitianbao/article/details/121787523

延伸 · 閱讀

精彩推薦
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
主站蜘蛛池模板: 福利视频网址导航 | 免费观看黄色12片一级视频 | 精品国产三级 | 亚洲专区在线播放 | 欧美久久久久久久久久久久久久 | 中文一二区 | caoporn最新地址 | 日本电影中文字幕 | 91在线观看高清视频 | 欧美视频精品 | 日韩精品影院 | 久久免费一区 | 亚洲国产精品一区二区久久 | 日韩在线| 一本综合久久 | 国产精品美女久久久久高潮 | 一级黄色大片 | 精精国产xxxx视频在线野外 | 亚洲欧美自拍偷拍 | 午夜影视免费观看 | 在线看黄网站 | 99视频在线 | 91cn在线观看| 黄色在线免费 | 国内精品视频在线观看 | 一本色道久久综合狠狠躁篇的优点 | 成人免费毛片嘿嘿连载视频 | 成人h动漫精品一区二区樱花 | 亚洲精品成a人在线 | 日韩成人在线视频 | 手机看片在线 | 美女视频黄色片 | 成人影院在线 | 欧美国产日韩在线 | 精品香蕉视频 | 国产一区| 国产一区av在线 | 91av视频在线 | 很黄很色很爽的视频 | 精品一区二区电影 | 免费观看爱爱视频 |