OpenCV?直方圖均衡化的實(shí)現(xiàn)原理解析
直方圖均衡化介紹
圖像的直方圖是什么?
圖像直方圖,是指對(duì)整個(gè)圖像像在灰度范圍內(nèi)的像素值(0~255)統(tǒng)計(jì)出現(xiàn)頻率次數(shù),據(jù)此生成的直方圖,稱為圖像直方圖-直方圖。直方圖反映了圖像灰度的分布情況。是圖像的統(tǒng)計(jì)學(xué)特征。
簡(jiǎn)單來說:直方圖是圖像中像素強(qiáng)度分布的圖形表達(dá)方式,它統(tǒng)計(jì)了每一個(gè)強(qiáng)度值所具有的像素個(gè)數(shù)。
例如下面這張圖片,左圖為灰度圖,右圖統(tǒng)計(jì)了這張圖的所有像素值(0~255)對(duì)應(yīng)的像素個(gè)數(shù)

更形象解釋
更形象的來說,將下面像素格子對(duì)等為如上圖的圖像
假設(shè)有該圖像數(shù)據(jù)8x8,像素值范圍0~14共15個(gè)灰度等級(jí),統(tǒng)計(jì)得到各個(gè)等級(jí)出現(xiàn)次數(shù)及直方圖如下圖所示:

則對(duì)上面抽象出來的圖像(像素格子)進(jìn)行像素與出現(xiàn)次數(shù)的統(tǒng)計(jì)得到下圖左側(cè)的表格,做出頻率圖如右圖所示:

什么是直方圖均衡化?
是一種提高圖像對(duì)比度的方法,拉伸圖像灰度值范圍。
簡(jiǎn)單來說, 以上面狗狗的的直方圖為例, 你可以看到像素主要集中在中間的一些強(qiáng)度值上。直方圖均衡化要做的就是 拉伸 這個(gè)范圍。就是下面藍(lán)框框出來的范圍就是像素主要幾種區(qū)間。

見下圖:綠圈 圈出了 像素分布率較低像素值,對(duì)其應(yīng)用均衡化后(將中間藍(lán)框像素分布較高的區(qū)間拉伸), 得到了中間圖所示的直方圖。均衡化的圖像見下面右圖.

直方圖均衡化是如何實(shí)現(xiàn)的?
通過remap我們知道可以將圖像灰度分布從一個(gè)分布映射到另外一個(gè)分布,然后在得到映射后的像素值即可。
映射關(guān)系如下:

其中源直方圖 H(i), 累積分布 H’(i)函數(shù),equalized()為重映射后的圖像
直方圖均衡化的作用
因?yàn)橹狈綀D均衡化處理之后,原來比較少像素的灰度會(huì)被分配到別的灰度去,像素相對(duì)集中, 處理后灰度范圍變大,對(duì)比度變大,清晰度變大,所以能有效增強(qiáng)圖像。
直方圖均衡化是圖像處理領(lǐng)域中利用圖像直方圖對(duì)對(duì)比度進(jìn)行調(diào)整的方法。這種方法通常用來增加許多圖像的局部對(duì)比度,尤其是當(dāng)圖像的有用數(shù)據(jù)的對(duì)比度相當(dāng)接近的時(shí)候。通過這種方法,亮度可以更好地在直方圖上分布。這樣就可以用于增強(qiáng)局部的對(duì)比度而不影響整體的對(duì)比度,直方圖均衡化通過有效地?cái)U(kuò)展常用的亮度來實(shí)現(xiàn)這種功能。
總的來說,直方圖均衡化是用來增強(qiáng)對(duì)比度的
直方圖均衡化步驟
- 加載源圖像
- 轉(zhuǎn)為灰度圖
- EqualizeHist 對(duì)直方圖均衡化
- 顯示均衡化后圖像.
相關(guān)API
equalizeHist
cv::equalizeHist( InputArray src, // 輸入圖像,必須是8-bit的單通道圖像 OutputArray dst // 輸出結(jié)果 )
代碼示例
灰度圖均值化

#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
using namespace cv;
int main(int argc, char** argv)
{
Mat src, dst;
src = imread("./test2.jpg");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
cvtColor(src, src, CV_BGR2GRAY);
equalizeHist(src, dst);
char INPUT_T[] = "input image";
char OUTPUT_T[] = "result image";
namedWindow(INPUT_T, CV_WINDOW_AUTOSIZE);
namedWindow(OUTPUT_T, CV_WINDOW_AUTOSIZE);
imshow(INPUT_T, src);
imshow(OUTPUT_T, dst);
waitKey(0);
return 0;
}彩色圖均值化

#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
using namespace cv;
using namespace std;
int main(int argc, char*argv)
{
Mat src, dst, dst1;
src = imread("./test2.jpg");
if (!src.data)
{
printf("could not load image...\n");
return -1;
}
char input[] = "input image";
char output[] = "histogram iamge";
namedWindow(input, CV_WINDOW_AUTOSIZE);
namedWindow(output, CV_WINDOW_AUTOSIZE);
imshow(input, src);
// 分割通道
vector<Mat>channels;
split(src, channels);
Mat blue, green, red;
blue = channels.at(0);
green = channels.at(1);
red = channels.at(2);
// 分別對(duì)BGR通道做直方圖均衡化
equalizeHist(blue, blue);
equalizeHist(green, green);
equalizeHist(red, red);
// 合并通道
merge(channels, dst);
imshow(output, dst);
waitKey(0);
return 0;
}到此這篇關(guān)于OpenCV 直方圖均衡化的文章就介紹到這了,更多相關(guān)OpenCV 直方圖均衡化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c語(yǔ)言實(shí)現(xiàn)兩個(gè)值互相交換的函數(shù)
本文通過代碼給大家介紹c語(yǔ)言實(shí)現(xiàn)兩個(gè)值互相交換的函數(shù),通過實(shí)例代碼給大家講解的很詳細(xì),具有一定的參考借鑒價(jià)值,對(duì)c語(yǔ)言兩個(gè)值互換函數(shù)相關(guān)知識(shí)感興趣的朋友一起看看吧2021-05-05
C++面試八股文之STL標(biāo)準(zhǔn)模板庫(kù)使用詳解
這篇文章主要為大家介紹了C++面試八股文之STL標(biāo)準(zhǔn)模板庫(kù)使用詳解,<BR>有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
C語(yǔ)言?智能指針?shared_ptr?和?weak_ptr
這篇文章主要介紹了C語(yǔ)言?智能指針?shared_ptr?和?weak_ptr,weak_ptr引入可以解決shared_ptr交叉引用時(shí)無法釋放資源的問題,下面來學(xué)習(xí)具體相關(guān)內(nèi)容吧,需要的朋友可以參考一下2022-04-04
C語(yǔ)言之浮點(diǎn)數(shù)的表示與儲(chǔ)存方式
這篇文章主要介紹了C語(yǔ)言之浮點(diǎn)數(shù)的表示與儲(chǔ)存方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
GCC編譯過程(預(yù)處理,編譯,匯編,鏈接)及GCC命令詳解
文章詳細(xì)介紹了GCC編譯器的工作原理,包括預(yù)處理、編譯、匯編和鏈接四個(gè)主要階段,每個(gè)階段都有其特定的任務(wù)和輸出文件,文章還解釋了如何使用GCC命令選項(xiàng)來查看每個(gè)階段的輸出,以及如何通過調(diào)整編譯選項(xiàng)來優(yōu)化程序性能或調(diào)試問題,感興趣的朋友跟隨小編一起看看吧2024-11-11

