OpenCV4入门082:图像直方图匹配
入门系列索引:OpenCV入门索引目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
#include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> using namespace cv; using namespace std; int main() { cv::Mat srcImage = cv::imread("..\\images\\flower3.jpg"); cv::Mat dstImage = cv::imread("..\\images\\sea.jpg"); if( !srcImage.data || !dstImage.data ) return 1; cv::resize(dstImage, dstImage,cv::Size(srcImage.rows,srcImage.cols),0,0,CV_INTER_LINEAR); cv::imshow("srcImage", srcImage); cv::imshow("dstImage", dstImage); cv::waitKey(0); float srcCdfArr[256]; float dstCdfArr[256]; int srcAddTemp[256]; int dstAddTemp[256]; int histMatchMap[256]; for (int i = 0; i < 256; i++){ srcAddTemp[i] = 0; dstAddTemp[i] = 0; srcCdfArr[i]= 0; dstCdfArr[i] = 0; histMatchMap[i]=0; } float sumSrcTemp = 0; float sumDstTemp = 0; int nSrcPix = srcImage.cols * srcImage.rows; int nDstPix = dstImage.cols * dstImage.rows; int matchFlag = 0; for(size_t nrow = 0; nrow < srcImage.rows; nrow++) for(size_t ncol = 0; ncol < srcImage.cols; ncol++) { srcAddTemp[(int)srcImage.at<uchar>(nrow, ncol)]++; dstAddTemp[(int)dstImage.at<uchar>(nrow, ncol)]++; } for(int i=0; i<256; i++) { sumSrcTemp += srcAddTemp[i]; srcCdfArr[i] = sumSrcTemp / nSrcPix; sumDstTemp += dstAddTemp[i]; dstCdfArr[i] = sumDstTemp / nDstPix; } for(int i=0; i< 256; i++) { float minMatchPara = 20; for(int j=0; j< 256; j++) { if (minMatchPara > abs(srcCdfArr[i] - dstCdfArr[j])) { minMatchPara = abs(srcCdfArr[i] - dstCdfArr[j]); matchFlag = j; } } histMatchMap[i] = matchFlag; } cv::Mat HistMatchImage = cv::Mat::zeros(srcImage.rows, srcImage.cols, CV_8UC3); cv::cvtColor(srcImage, HistMatchImage, cv::COLOR_BGR2GRAY); for(int i = 0; i < HistMatchImage.rows; i++) for(int j = 0; j < HistMatchImage.cols; j++) { HistMatchImage.at<uchar>(i, j) = histMatchMap[(int)HistMatchImage.at<uchar>(i, j)]; }
cv::imshow("resultImage", HistMatchImage); cv::waitKey(0); return 0; }
|