0017-用目標影象對源影象進行直方圖匹配
直方圖匹配變換可以使得源影象和目標影象的直方圖相似或相同,這樣,通過直方圖變換,它們的顏色分佈規律也就一樣了。
直方圖匹配變換的思路如下:
1 分別求解源圖片和目標圖片累積直方圖概率分佈;
2 根據累積累方圖建立直方圖匹配變換對映;
3 根據直方圖匹配變換對映對原圖進行直方圖匹配操作。OpenCV環境下對灰度圖進行直方圖匹配的原始碼如下:
程式碼中用到的影象下載連結:http://pan.baidu.com/s/1qYmd1Y8 密碼:p22l
//opencv版本:OpenCV3.0 //VS版本:VS2013 //Author:qxsf321.net #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/imgproc/types_c.h> #include <opencv2/highgui/highgui.hpp> #include <opencv2/highgui/highgui_c.h> #include <iostream> using namespace cv; using namespace std; cv::Mat ycMatchHist(cv::Mat srcImg, cv::Mat dstImg) { //ycMatchHist函式的完整程式碼請搜尋公眾號"qxsf321",關注後回覆0017即可獲取 //ycMatchHist函式的完整程式碼請搜尋公眾號"qxsf321",關注後回覆0017即可獲取 //ycMatchHist函式的完整程式碼請搜尋公眾號"qxsf321",關注後回覆0017即可獲取 } int main() { Mat srcImage_bgr = imread("20.jpg"); Mat grayImage_src; cvtColor(srcImage_bgr, grayImage_src, CV_BGR2GRAY); imshow("【待匹配的灰度圖】", grayImage_src); Mat dstImg_bgr = imread("21.jpg"); Mat grayImage_dst; cvtColor(dstImg_bgr, grayImage_dst, CV_BGR2GRAY); imshow("【匹配目標的灰度圖】", grayImage_dst); Mat out; out = ycMatchHist(grayImage_src, grayImage_dst); imshow("【原圖匹配之後】", out); waitKey(0); return 0; }
程式碼說明:
這裡重點說下直方圖匹配演算法的這段程式碼,程式碼如下:
int histMap[256];
int minTag;
for (int i = 0; i<graylevel; i++)
{
float minMap = 10.f;
for (int j = 0; j<graylevel; j++)
{
if (minMap > abs(srcCdfArr - dstCdfArr[j]))
{
minMap = abs(srcCdfArr - dstCdfArr[j]);
minTag = j;
}
}
histMap = minTag;
}
先說這段程式碼做了什麼?
答:這段程式碼實現了進行直方圖匹配變換的對映表的建立,能過這個對映表,我們可以把源圖中每個畫素的灰度值對映到一個新的灰度值。
對映的原則是什麼?
答:兩個影象的累積直方圖概率分佈的某兩個灰度值之差最小,則建立一個對映。
思考這段程式碼的時候需要知道什麼?
答:累積直方圖概率分佈是一個遞增函式。
經過對映之後的源圖的直方圖和目標圖幾乎是一樣的,如果要驗證,大家可用部落格https://blog.csdn.net/lehuoziyuan/article/details/84064822中計算直方圖的程式碼去驗證!
執行結果截圖如下:
從執行結果截圖中我們可以看出,目標圖片比源圖“暗”,而源圖在經過直方圖匹配之後也變暗了。