资源简介
基于opencv的直方图均衡只能处理8位的图像,但是有时候我们接受的高分辨率的图像不是8位,是16位或者更高的图像。
这个代码实现了基于16位单通道图像的直方图均衡。如果想换成32位的,可以在此段代码的基础上进行更改,只需要更改灰度变换的代码部分即可。
代码片段和文件信息
#include
#include
#include
#include
using namespace std;
using namespace cv;
void EqualizeHist(Mat& Mat& intint);
void EqualizeHist_Map(Mat&Mat& intint);
void EqualizeHist_Array(Mat& Mat& intint);
int main() {
Mat src = imread(“D:/test/44.jpg“ 0);
//8位直方图均衡对比
Mat dst = src.clone();
Mat dst2 = src.clone();
Mat dst3 = src.clone();
Mat dst4 = src.clone();
clock_t start4 ends4;
start4 = clock();
equalizeHist(src dst4);
ends4 = clock();
cout << “opencv自带的接口:“ <<(double) (ends4 - start4) / CLOCKS_PER_SEC << “秒“ << endl;
clock_t start ends;
start = clock();
EqualizeHist(src dst2568);
ends = clock();
cout << “直方图均衡原理的6步实现:“<<(double)(ends - start) / CLOCKS_PER_SEC << “秒“ << endl;
clock_t start2 ends2;
start2 = clock();
EqualizeHist_Map(src dst2 256 8);
ends2 = clock();
cout <<“Map结构: “ <<(double)(ends2 - start2 )/ CLOCKS_PER_SEC << “秒“ <<““ << endl;
clock_t start3 ends3;
start3 = clock();
EqualizeHist_Array(src dst3 256 8);
ends3 = clock();
cout <<“Array优化:“<< (ends3 - start3) / (double)CLOCKS_PER_SEC << “秒“ << endl;
/*16位单通道直方图均衡
将16位的直方图均衡化成8位的图进行显示
将65536内的像素值归一化到256的像素值内
*/
//Mat dst5 = Mat(src.rowssrc.rowsCV_8UC1);
//EqualizeHist_Array(src dst6553616);
imshow(“原图“ src);
imshow(“自带“ dst4);
imshow(“6步“ dst);
imshow(“map“ dst2);
imshow(“数组“ dst3);
waitKey(0);
return 0;
}
// 数组直方图均衡化
void EqualizeHist(Mat& src Mat& dst int graylevel int dataBit)
{
//第1步:计算原始图像的像素总个数
int ss = src.cols * src.rows;
if (!src.data)
{
return;
}
//第2步:计算图像的直方图,即计算出每一取值范围内的像素值个数
int* mp = new int[graylevel];
memset(mp 0 sizeof(int) * graylevel);//初始化
for (size_t i = 0; i < src.rows; i++)
{
uchar* ptr = src.ptr(i);
for (size_t j = 0; j < src.cols; j++)
{
int value = ptr[j];
mp[value]++;
}
}
//第3步:计算灰度分布频率+灰度累加分布频率+重新计算均衡化后的灰度值,四舍五入
double* valuePro = new double[graylevel];
memset(valuePro 0 sizeof(double) * graylevel);//初始化 一定要记住
for (size_t i = 0; i < graylevel; i++)
{
valuePro[i] = ((double)mp[i] / ss);
}
//第四步:计算灰度累计分布频率
for (size_t i = 1; i < graylevel; i++)
{
valuePro[i] = valuePro[i - 1] + valuePro[i];
}
//第五步:重新计算均衡化后的灰度值,四舍五入。参考公式:(N-1)*T+0.5
for (size_t i = 0; i < graylevel; i++)
{
mp[i] = (uchar)(255 * valuePro[i] + 0.5);
}
//第6步:灰度变换
if (dataBit == 8)
{
for (size_t i = 0; i < src.rows; i++)
{
uchar* pSrc = src.ptr(i);
uchar* pDst = dst.ptr(i);
for (size_t j = 0; j < src.cols; j++)
{
pDst[j] = mp[pSrc[j]];
}
}
}
else if(dataBit==16){
//第四步:灰度变换
for (size_t i = 0; i < src.rows; i++)
{
unsigned short* pSrc = src.ptr(i);
uchar* pDst = dst.ptr(i);
for (size_t j = 0; j < src.cols; j++)
{
pDst[j] = mp[pSrc[j]];
}
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 44297 2020-09-10 16:49 直方图均衡(支持单通道16位和8位图像)\44.jpg
文件 537005 2020-09-10 16:51 直方图均衡(支持单通道16位和8位图像)\8位直方图均衡.png
..A..H. 45568 2020-09-10 16:52 直方图均衡(支持单通道16位和8位图像)\Project1\.vs\Project1\v16\.suo
文件 45010944 2020-09-10 16:52 直方图均衡(支持单通道16位和8位图像)\Project1\.vs\Project1\v16\Browse.VC.db
文件 153681920 2020-09-10 15:45 直方图均衡(支持单通道16位和8位图像)\Project1\.vs\Project1\v16\ipch\AutoPCH\aa648e9605550ee5\源.ipch
文件 32964608 2020-09-07 15:12 直方图均衡(支持单通道16位和8位图像)\Project1\.vs\Project1\v16\ipch\AutoPCH\d164b26aedc4c422\源.ipch
文件 543 2020-09-10 15:54 直方图均衡(支持单通道16位和8位图像)\Project1\.vs\Project1\v16\TestStore\0\000.testlog
文件 24 2020-09-07 16:56 直方图均衡(支持单通道16位和8位图像)\Project1\.vs\Project1\v16\TestStore\0\testlog.manifest
文件 7215 2020-09-07 15:14 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\Project1.vcxproj
文件 956 2020-09-07 15:14 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\Project1.vcxproj.filters
文件 168 2020-09-07 15:11 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\Project1.vcxproj.user
文件 732 2020-09-10 15:52 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\x64\Debug\Project1.Build.CppClean.log
文件 3043 2020-09-10 16:48 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\x64\Debug\Project1.log
文件 644 2020-09-10 16:48 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\x64\Debug\Project1.tlog\CL.command.1.tlog
文件 51762 2020-09-10 16:48 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\x64\Debug\Project1.tlog\CL.read.1.tlog
文件 384 2020-09-10 16:48 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\x64\Debug\Project1.tlog\CL.write.1.tlog
文件 1134 2020-09-10 16:48 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\x64\Debug\Project1.tlog\li
文件 2640 2020-09-10 16:48 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\x64\Debug\Project1.tlog\li
文件 376 2020-09-10 16:48 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\x64\Debug\Project1.tlog\li
文件 151 2020-09-10 16:48 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\x64\Debug\Project1.tlog\Project1.lastbuildstate
文件 0 2020-09-10 15:52 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\x64\Debug\Project1.vcxproj.FileListAbsolute.txt
文件 535552 2020-09-10 16:48 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\x64\Debug\vc142.idb
文件 1953792 2020-09-10 16:48 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\x64\Debug\vc142.pdb
文件 920538 2020-09-10 16:48 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\x64\Debug\源.obj
文件 6498 2020-09-10 16:52 直方图均衡(支持单通道16位和8位图像)\Project1\Project1\源.cpp
文件 1445 2020-09-07 15:11 直方图均衡(支持单通道16位和8位图像)\Project1\Project1.sln
文件 194560 2020-09-10 16:48 直方图均衡(支持单通道16位和8位图像)\Project1\x64\Debug\Project1.exe
文件 3837512 2020-09-10 16:48 直方图均衡(支持单通道16位和8位图像)\Project1\x64\Debug\Project1.ilk
文件 2084864 2020-09-10 16:48 直方图均衡(支持单通道16位和8位图像)\Project1\x64\Debug\Project1.pdb
目录 0 2020-09-10 16:57 直方图均衡(支持单通道16位和8位图像)\Project1\.vs\Project1\v16\ipch\AutoPCH\aa648e9605550ee5
............此处省略19个文件信息
评论
共有 条评论