OpenCV?直方圖均衡化的實現(xiàn)原理解析
直方圖均衡化介紹
圖像的直方圖是什么?
圖像直方圖,是指對整個圖像像在灰度范圍內(nèi)的像素值(0~255)統(tǒng)計出現(xiàn)頻率次數(shù),據(jù)此生成的直方圖,稱為圖像直方圖-直方圖。直方圖反映了圖像灰度的分布情況。是圖像的統(tǒng)計學特征。
簡單來說:直方圖是圖像中像素強度分布的圖形表達方式,它統(tǒng)計了每一個強度值所具有的像素個數(shù)。
例如下面這張圖片,左圖為灰度圖,右圖統(tǒng)計了這張圖的所有像素值(0~255)對應的像素個數(shù)
更形象解釋
更形象的來說,將下面像素格子對等為如上圖的圖像
假設有該圖像數(shù)據(jù)8x8,像素值范圍0~14共15個灰度等級,統(tǒng)計得到各個等級出現(xiàn)次數(shù)及直方圖如下圖所示:
則對上面抽象出來的圖像(像素格子)進行像素與出現(xiàn)次數(shù)的統(tǒng)計得到下圖左側的表格,做出頻率圖如右圖所示:
什么是直方圖均衡化?
是一種提高圖像對比度的方法,拉伸圖像灰度值范圍。
簡單來說, 以上面狗狗的的直方圖為例, 你可以看到像素主要集中在中間的一些強度值上。直方圖均衡化要做的就是 拉伸 這個范圍。就是下面藍框框出來的范圍就是像素主要幾種區(qū)間。
見下圖:綠圈 圈出了 像素分布率較低像素值,對其應用均衡化后(將中間藍框像素分布較高的區(qū)間拉伸), 得到了中間圖所示的直方圖。均衡化的圖像見下面右圖.
直方圖均衡化是如何實現(xiàn)的?
通過remap我們知道可以將圖像灰度分布從一個分布映射到另外一個分布,然后在得到映射后的像素值即可。
映射關系如下:
其中源直方圖 H(i)
, 累積分布 H’(i)函數(shù),equalized()為重映射后的圖像
直方圖均衡化的作用
因為直方圖均衡化處理之后,原來比較少像素的灰度會被分配到別的灰度去,像素相對集中, 處理后灰度范圍變大,對比度變大,清晰度變大,所以能有效增強圖像。
直方圖均衡化是圖像處理領域中利用圖像直方圖對對比度進行調(diào)整的方法。這種方法通常用來增加許多圖像的局部對比度,尤其是當圖像的有用數(shù)據(jù)的對比度相當接近的時候。通過這種方法,亮度可以更好地在直方圖上分布。這樣就可以用于增強局部的對比度而不影響整體的對比度,直方圖均衡化通過有效地擴展常用的亮度來實現(xiàn)這種功能。
總的來說,直方圖均衡化是用來增強對比度的
直方圖均衡化步驟
- 加載源圖像
- 轉為灰度圖
- EqualizeHist 對直方圖均衡化
- 顯示均衡化后圖像.
相關API
equalizeHist
cv::equalizeHist( InputArray src, // 輸入圖像,必須是8-bit的單通道圖像 OutputArray dst // 輸出結果 )
代碼示例
灰度圖均值化
#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); // 分別對BGR通道做直方圖均衡化 equalizeHist(blue, blue); equalizeHist(green, green); equalizeHist(red, red); // 合并通道 merge(channels, dst); imshow(output, dst); waitKey(0); return 0; }
到此這篇關于OpenCV 直方圖均衡化的文章就介紹到這了,更多相關OpenCV 直方圖均衡化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C語言編程中統(tǒng)計輸入的行數(shù)以及單詞個數(shù)的方法
這篇文章主要介紹了C語言編程中統(tǒng)計輸入的行數(shù)以及單詞個數(shù)的方法,利用最基礎的循環(huán)和判斷語句寫成,需要的朋友可以參考下2015-11-11使用C語言中的time函數(shù)獲取系統(tǒng)時間
在C語言中可以使用time函數(shù)來獲取系統(tǒng)時間,以下對time函數(shù)進行了介紹,需要的朋友可以過來參考下2013-07-07