資源簡介
基于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?<“秒“?<
clock_t?start?ends;
start?=?clock();
EqualizeHist(src?dst2568);
ends?=?clock();
cout?<“直方圖均衡原理的6步實現:“<<(double)(ends?-?start)?/?CLOCKS_PER_SEC?<“秒“?<
clock_t?start2?ends2;
start2?=?clock();
EqualizeHist_Map(src?dst2?256?8);
ends2?=?clock();
cout?<<“Map結構:?“?<<(double)(ends2?-?start2?)/?CLOCKS_PER_SEC?<“秒“?<<““?<
clock_t?start3?ends3;
start3?=?clock();
EqualizeHist_Array(src?dst3?256?8);
ends3?=?clock();
cout?<<“Array優化:“<(ends3?-?start3)?/?(double)CLOCKS_PER_SEC?<“秒“?<
/*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? {
uchar*?ptr?=?src.ptr(i);
for?(size_t?j?=?0;?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? {
valuePro[i]?=?((double)mp[i]?/?ss);
}
//第四步:計算灰度累計分布頻率
for?(size_t?i?=?1;?i? {
valuePro[i]?=?valuePro[i?-?1]?+?valuePro[i];
}
//第五步:重新計算均衡化后的灰度值,四舍五入。參考公式:(N-1)*T+0.5
for?(size_t?i?=?0;?i? {
mp[i]?=?(uchar)(255?*?valuePro[i]?+?0.5);
}
//第6步:灰度變換
if?(dataBit?==?8)
{
for?(size_t?i?=?0;?i? {
uchar*?pSrc?=?src.ptr(i);
uchar*?pDst?=?dst.ptr(i);
for?(size_t?j?=?0;?j? {
pDst[j]?=?mp[pSrc[j]];
}
}
}
else?if(dataBit==16){
//第四步:灰度變換
for?(size_t?i?=?0;?i? {
unsigned?short*?pSrc?=?src.ptr(i);
uchar*?pDst?=?dst.ptr(i);
for?(size_t?j?=?0;?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個文件信息
評論
共有 條評論