直方圖均勻化簡介
從這張未經處理的灰度圖可以看出,其灰度集中在非常小的一個范圍內。這就導致了圖片的強弱對比不強烈。
直方圖均衡化的目的,就是把原始的直方圖變換為在整個灰度范圍(0~255)內均勻分布的形式,從而增加像素灰度值的動態范圍,達到增強圖像整體對比度的效果。
直方圖均衡化的列表計算
序號 |
運算 |
步驟和結果 | |||||||
1 |
列出原始圖灰度值 f(0 ≤ f ≤ L-1) |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
2 | 列出原始直方圖(概率表達) | 0.02 | 0.05 | 0.09 | 0.12 | 0.14 | 0.2 | 0.22 | 0.16 |
3 | 計算原始累計直方圖 gf(灰度值 ≤ f 的概率和) | 0.02 | 0.07 | 0.16 | 0.28 | 0.42 | 0.62 | 0.84 | 1.00 |
4 | 取整 g=(int) [(L-1)·gf + 0.5] | 0 | 0 | 1 | 2 | 3 | 4 | 6 | 7 |
5 | 確定對應關系(原灰度值 -> 新灰度值) | 0->0 | 1->0 | 2->1 | 3->2 | 4->3 | 5->4 | 6->6 | 7->7 |
6 | 更新直方圖 | 0.07 | 0.09 | 0.12 | 0.14 | 0.2 | 0 | 0.22 | 0.16 |
實現直方圖均衡化:equalizeHist 函數
equalize 函數實現的灰度直方圖均衡化算法,就是把直方圖的每個灰度值進行歸一化處理,求每種灰度的累積分布,接着得到一個映射的灰度映射表,然后根據相應的灰度值來修正原圖中的每個像素。
void equalize(InputArray src, OutputArray dst);
- src,輸入圖像,即源圖像,填 Mat 類的對象即可,但需要為 8 位單通道的圖像。
- dst,輸出結果,需要和源圖像有一樣的尺寸和類型。
代碼示例:
#include<opencv.hpp> #include<iostream>
using namespace std; using namespace cv; int main() { Mat src = imread("C:/Users/齊明洋/Desktop/1.jpg"); imshow("src", src); Mat gray, dst; cvtColor(src, gray, COLOR_BGR2GRAY); imshow("gray", gray); equalizeHist(gray, dst); imshow("dst", dst); waitKey(0); }
效果展示: