C++实现直方图匹配,附源代码

更新时间:2023-07-20 18:54:25 阅读: 评论:0

C++实现直⽅图匹配,附源代码⽬录
接⼝设计
static BOOL histmatch(CImageDatat &imgIn, CImageDatat &img_standard, CImageDatat &imgOut);函数的三个参数分别是输⼊图像,参考图像,输出图像。
窗⼝界⾯设计
运⾏结果
待处理图像:
参考图像:
处理结果:
结果讨论
说明直⽅图匹配与直⽅图均衡两种处理算法原理的区别。考虑在什么情况下的两种算法处理结果⼀致。
直⽅图匹配是以参考图像直⽅图为标准,将待匹配图像的直⽅图转换为和参考图像相同的形状,使得两幅图的灰度值分布相同。⽽直⽅图均衡是使⼀幅图的灰度值均匀分布。如下图所⽰,在参考图像的灰度值为均匀分布时,两种算法处理结果⼀致。可以将直⽅图均衡化看作是直⽅图匹配在参考的直⽅
图形态为均匀分布条件下的特例。
均衡化后的参考图像
直⽅图匹配结果
直⽅图均衡化结果
可见当参考图像的灰度值为均匀分布时,两种算法处理结果⼀致。世界最大城市
源代码
/*
* 只展⽰核⼼代码,省略类定义
*
*/
//初始化
void CImageProcessingEx::init(CImageDatat &imgIn)
{
n_band = imgIn.m_rastercount;
n_row = imgIn.m_ysize;
n_col = imgIn.m_xsize;
心理健康教育主题n_pixel = n_row*n_col*n_band;
n_area = n_row * n_col;
row_mid=n_row/2;
col_mid=n_col/2;
}
/
/计算直⽅图函数
void CImageProcessingEx::getHist(const CImageDatat& img,int band,std::vector<int>& hist)
void CImageProcessingEx::getHist(const CImageDatat& img,int band,std::vector<int>& hist)
{
int value;
int N_row = img.m_ysize;
int N_col = img.m_xsize;
const double* imgData = img.m_data;
for(int row=0; row<N_row;++row)//对图像逐⾏逐列进⾏扫描,计算完成直⽅图
{
for(int col=0; col<N_col;++col)遗精了怎么办
{
int index = band * N_row * N_col + row * N_col + col;
value=(UINT8)imgData[index];
hist[value]++;
}
}
}
//直⽅图匹配徐州菜
BOOL CImageProcessingEx::histmatch(CImageDatat &imgIn, CImageDatat &imgRef, CImageDatat &imgOut) {
const int LEVEL =256;//灰度值个数
/* 确保输⼊和参考图像不为空或者两张图像波段数不等 */
pty()||pty()||imgIn.m_rastercount!=imgRef.m_rastercount)
{
return FALSE;
}
公债int band,row,col,i,j;//⽤于遍历
/*统计表*/
std::vector<int>input_hist(LEVEL),ref_hist(LEVEL);//输⼊图直⽅图和参考图直⽅图
std::vector<double>input_accuHist(LEVEL),ref_accuHist(LEVEL);//输⼊图累积直⽅图和参考累积直⽅图
//记录输⼊图像的尺⼨
init(imgIn);
/* 创建输出图像 */
降压中药配方大全if(FALSE == ate(n_col,n_row,n_band))
欣络平{
return FALSE;
}
double*output_data = imgOut.m_data;
const double*input_data=imgIn.m_data;
const double*ref_data=imgRef.m_data;
for(band =0; band < n_band; band++)
{
/*  步骤 1:计算输⼊图像和参考图像的直⽅图  */
getHist(imgIn, band,input_hist);
getHist(imgRef, band,ref_hist);
/*  步骤 2:计算输⼊图像和参考图像的累积直⽅图  */
input_accuHist[0]= input_hist[0]/ n_area;
ref_accuHist[0]= ref_hist[0]/ n_area;
for(i =1; i < LEVEL -1;++i)//计算完成累积直⽅图
{
input_accuHist[i]= input_accuHist[i -1]+double(input_hist[i])/ n_area;
ref_accuHist[i]= ref_accuHist[i -1]+double(ref_hist[i])/ n_area;教改论文
}
input_accuHist[255]=1;
ref_accuHist[255]=1;
/
*  步骤 3:根据⽤累积直⽅图建⽴灰度变换函数,并逐⾏逐列进⾏像素的灰度变换 */
//建⽴映射
vector<double>deviation(LEVEL);//中间临时数据
int mapping_table[LEVEL];//记录映射的表
vector<double>::iterator minElement;
for(i =0; i < LEVEL;++i)//在输⼊图的累积直⽅图中遍历
{
for(j =0; j < LEVEL;++j)//在参考图的累积直⽅图中遍历
{
deviation[j]=abs(input_accuHist[i]- ref_accuHist[j]);//对于输⼊累积直⽅图中的每个值与参考图累积直⽅图中的所有值作差}
minElement =min_element(deviation.begin(), d());//找到最⼩的差
mapping_table[i]=distance(deviation.begin(), minElement);//最⼩差的下标放⼊映射表
}
//灰度变换
int index;
for(row =0; row < n_row;++row)
{
for(col =0; col < n_col;++col)
{
index =coo2ind(band,row,col);
output_data[index]= mapping_table[int(input_data[index])];
}
}
}
return TRUE;
}

本文发布于:2023-07-20 18:54:25,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1107418.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   参考   匹配
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图