1. 程式人生 > >0017-用目標影象對源影象進行直方圖匹配

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中計算直方圖的程式碼去驗證!
執行結果截圖如下

從執行結果截圖中我們可以看出,目標圖片比源圖“暗”,而源圖在經過直方圖匹配之後也變暗了。