#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
uchar* SigResultBandMap = new uchar[256];
void EqualHist(cv::Mat& gray, std::map<int, int>& cnt, std::map<int, double>& valuePro)
{
//统计像素(0-255)的个数
for (int i = 0; i < gray.rows; i++)
{
//访问元素:
uchar* ptr = gray.data + i * gray.cols;
for (int j = 0; j < gray.cols; j++)
{
int value = ptr[j];
cnt[value]++;
}
}
//计算频率,并计算累计频率
int sum = gray.cols * gray.rows;
double sumPro = 0.0;
for (int i = 0; i < 256; i++)
{
sumPro += ((1.0 * cnt[i]) / sum);
valuePro[i] = sumPro;
}
}
void minDist(std::map<int, double>& valueProGeo, std::map<int, double>& valueProBase, uchar* SigResultBandMap)
{
for (int i = 0; i < 256; i++)
{
double MinValue = 255;//最小值初始化
for (int j = 0; j < 256; j++)
{
double subValue = fabs(valueProGeo[i] * 255 - valueProBase[j] * 255);
if (MinValue > subValue)
{
MinValue = subValue;
SigResultBandMap[i] = j;
}
}
}
}
void ReplaceElement(cv::Mat& imageGeo, uchar* SigResultBandMap)
{
for (int row = 0; row < imageGeo.rows; row++)
{
uchar* ptr = imageGeo.data + row * imageGeo.cols;
for (int col = 0; col < imageGeo.cols; col++)
{
ptr[col] = SigResultBandMap[ptr[col]];
}
}
}
int main()
{
cv::Mat imageGeo = cv::imread("D:/software/image/geo.png");
cv::Mat imageBase = cv::imread("D:/software/image/base.png");
cv::Mat imageCopy = imageGeo.clone();
cv::Mat imageSplitGeo[3];
cv::Mat imageSplitBase[3];
cv::split(imageGeo, imageSplitGeo);
cv::split(imageBase, imageSplitBase);
for (int i = 0; i < 3; i++)
{
std::map<int, int>src;
std::map<int, int>base;
std::map<int, double> valueProGeo;
std::map<int, double> valueProBase;
uchar* SigResultBandMap = new uchar[256];
//分别对两张图像进行均衡化
EqualHist(imageSplitGeo[i], src, valueProGeo);
EqualHist(imageSplitBase[i], base, valueProBase);
minDist(valueProGeo, valueProBase, SigResultBandMap);
//替换元素
ReplaceElement(imageSplitGeo[i], SigResultBandMap);
delete[] SigResultBandMap;
}
//合并图像
cv::merge(imageSplitGeo, 3, imageGeo);
return 0;
}
直方图匹配
最新推荐文章于 2026-01-07 11:20:35 发布
1385

被折叠的 条评论
为什么被折叠?



