九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
OpenCV-繪制簡(jiǎn)易直方圖DrawHistImg

作者:翟天保Steven
版權(quán)聲明:著作權(quán)歸作者所有,商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處

需求說(shuō)明

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

// 繪制簡(jiǎn)易直方圖
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++測(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;
}


// 繪制簡(jiǎn)易直方圖
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è)試效果

圖1?原圖
圖2?灰度圖
圖3?直方圖

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

? ? ? ?如果文章幫助到你了,可以點(diǎn)個(gè)贊讓我知道,我會(huì)很快樂(lè)~加油!

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
反向投影(BackProjection)
【從零學(xué)習(xí)OpenCV 4】直方圖均衡化
OpenCV-圖像處理(25、直方圖比較)
OpenCV2 直方圖均衡化
對(duì)OpenCV直方圖的數(shù)據(jù)結(jié)構(gòu)CvHistogram的理解
Opencv學(xué)習(xí)筆記(十一)基于CAMshift算法的物體跟蹤實(shí)現(xiàn)
更多類(lèi)似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服