資源簡(jiǎn)介
GDAL調(diào)整圖像亮度之百分比截?cái)嗬臁:?jiǎn)介百分比截?cái)嗬煸恚约膀?yàn)證過(guò)的核心代碼,相關(guān)注釋,效果圖

代碼片段和文件信息
/**
?*?百分比截?cái)嗬欤褂冒俜直确秶鷥?nèi)的數(shù)據(jù)作為極值,然后做線性拉伸,也就是數(shù)據(jù)范圍的前n%?和后?n%?的像素映射到極值上即可.
?*?百分比裁剪方法的原理:
???????在很多情況下,你可以假設(shè)大部分像素都處于上限和下限范圍內(nèi)。你可以通過(guò)設(shè)置百分比把范圍之外的像素值都推到端點(diǎn)處。
???????然后在對(duì)范圍內(nèi)的像素值進(jìn)行線性拉伸。比如你現(xiàn)在的影像像素值范圍是30-210,并且最大最小裁剪比定義為2。
???????假設(shè)低的2%表示30-35像素值,高的2%表示205-210之間的像素值。所有30-35之間的值變?yōu)?,205-210之間的像素值重新在0-255之間分配。
?*/
/**?各波段的最小值列表和最大值列表*/
std::vector?_vecBandedMinValues?_vecBandedMaxValues?; //?NOLINT
//打開影像后讀取統(tǒng)計(jì)信息;初次會(huì)比較慢,但會(huì)自動(dòng)保存aux.xml同影像目錄文件,再次統(tǒng)計(jì)會(huì)先讀取該文件,獲取失敗才會(huì)重新統(tǒng)計(jì)
void?ReadRaster(GDALDataset*?_poDataset?int?_width?int?_height?int?minU?int?minV?int?maxU?int?maxV)
{
????//gdal打開數(shù)據(jù)源_poDataset
????int?rasterCount?=?_poDataset->GetRasterCount();
????for?(int?n?=?1;?n?<=?rasterCount;?n++)?{
????????GDALRasterBand?*poRasterBand?=?_poDataset->GetRasterBand(n);
????????if?(!poRasterBand)?{
????????????continue;
????????}
????????//統(tǒng)計(jì)0-255灰度值
????????int?nBuckets?=?256;
????????GUIntBig?*pBandHistogram?=?new?GUIntBig[nBuckets];
????????//正在統(tǒng)計(jì)直方圖...
????????poRasterBand->GetHistogram(-0.5?255.5?nBuckets?pBandHistogram?FALSE?FALSE?NULL?0);
????????//設(shè)置最大最小裁剪比例
????????double?percentMin?=?0.02?percentMax?=?0.02;
????????//8位圖圖像數(shù)據(jù)灰度值。
????????int?grayScale?=?255;
????????int?countMin?=?0?countMax?=?0;
????????percentMin?=?int(percentMin?*?_width?*?_height);
????????percentMax?=?int(percentMax?*?_width?*?_height);
????????//找出?percentMin的像素的灰度值
????????for?(int?i?=?0;?i?????????????countMin?+=?pBandHistogram[i];
????????????if?(countMin?>=?percentMin)?{
????????????????_vecBandedMinValues[n?-?1]?=?i;
????????????????break;
????????????}
????????}
????????//找出percnetMax的像素的灰度值
????????for?(int?k?=?nBuckets?-?1;?k?>=?0;?k--)?{
????????????countMax?+=?pBandHistogram[k];
????????????if?(countMax?>=?percentMax)?{
????????????????_vecBandedMaxValues[n?-?1]?=?k;
????????????????break;
????????????}
????????}
????????//讀取指定范圍柵格
????????std::vector?bandData((maxUds?-?minUds)?*?(maxVds?-?minVds));
????????poRasterBand->RasterIO(GF_Read?minU?minV?maxU?-?minU?maxV?-?minV?(void?*)&bandData[0]?maxUds?-?minUds?maxVds?-?minVds?GDT_Byte?0?0);
//讀取完整影像
//poRasterBand->RasterIO(GF_Read?0?0?_width?_height?(void?*)&bandData[0]?_width?_height?GDT_Byte?0?0);
????????//拉伸
????????int?minCount?=?0?maxCount?=?0?devCount?=?0;
????????for?(int?i?=?0;?i?????????{
????????????if?(bandData[i]?<=?_vecBandedMinValues[n-1])
????????????{
????????????????bandData[i]?=?0;
????????????}
????????????else?if?(bandData[i]?>=?_vecBandedMaxValues[n-1])
????????????{
????????????????bandData[i]?=?256;
????????????}
????????????else?if?(bandData[i]?>?_vecBandedMinValues[n-1]?&&?bandData[i]?????????????{
????????????????bandData[i]?=?double(bandData[i]?-?_vecBandedMinValues[n-1])?/?(double)(_vecBandedMaxValues[n-1]?-?_vecBandedMinValues[n-1])?*?256;
????????????}
????????}
????}
}
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????3680??2018-09-13?15:45??百分比截?cái)嗬?cpp
????.......???2703682??2018-09-13?14:45??Screenshot_2018-09-13-14-45-13.png
????.......???2166357??2018-09-07?18:25??Screenshot_2018-09-07-18-25-22.png
-----------?---------??----------?-----??----
??????????????4873719????????????????????3
評(píng)論
共有 條評(píng)論