最近有一項工做須要用到大規模影像,鑲嵌成一版圖,後期須要用到勻光勻色,因爲須要集成到代碼庫中,因此只能本身實現了。重點參考了論文-《算法
崔浩, 張力, 艾海濱,等. 利用基準色調的大範圍衛星影像色彩一致性處理算法[J]. 測繪學報, 2017, v.46(12):62-73.》,感謝做者的建議,在此再次表示感謝。很少說了,優化
在具體實現的時候,我將全部uint16位影像,所有轉爲uint8位,採用線性拉伸的方式:ui
clear tic fprintf(' ... Read Imagery ... ...\n'); [Img, R] = geotiffread('LongQuanYi_2020_FirstSeason.tif'); info = geotiffinfo('LongQuanYi_2020_FirstSeason.tif'); % Img = uint16(Img*10000); per = 0.01; % 線性拉伸比例 backValue = 0; % 背景像素值 % 這裏默認輸入圖像爲單通道 [ylen, xlen, channel] = size(Img); for i = 1:channel img = Img(:,:,i); fprintf(' ... Img Xlen: %d pixels\n', xlen); fprintf(' ... Img Ylen: %d pixels\n\n\n', ylen); % 線性拉伸 max_val = max(img(:)); min_val = min(img(:)); if min_val == backValue min_val = backValue + 1; % 背景值不能當最小值 end fprintf(' ... ... ... ... ... ... ... ... ... ...\n'); fprintf(' ... Min Val is %d \n', min_val); fprintf(' ... Max Val is %d \n', max_val); fprintf(' ... ... ... ... ... ... ... ... ... ...\n\n'); % 統計直方圖 % 輸入圖像爲16位,取值範圍爲 0 到 65535 bins = 1:65535; % 背景值不要參與統計 histcount = histcounts(img(:)', bins); %清除臨時變量 clear bins max_val min_val; % 直方圖裁剪,計算左值和右值 [l_val, r_val] = calc_lr_val(histcount, xlen*ylen, per); % 根據左值和右值,將圖像由16位映射至8位 img_8bit = img_map(img, l_val, r_val); Img(:,:,i) = img_8bit; end %% 真彩色影像組合 Img = cat(3,Img(:,:,3),Img(:,:,2),Img(:,:,1)); % 保存結果 geotiffwrite('LongQuanYi_2020_FirstSeason_uint8.tif', uint8(Img), R, 'GeoKeyDirectoryTag', ... info.GeoTIFFTags.GeoKeyDirectoryTag); toc
完了後,採用原論文中的方法,進行勻光勻色,這個方法主要是依據參考影像底圖進行處理,我用的100米分辨率google底圖,與目前不少勻光勻色軟件一致,好比colormap等等,可是google
,我的見解是,這些商業軟件吹噓成分過多,看結果吧:spa
再看一下細節部分:code
整個算法的計算效率仍是很是高的,可是有一點須要改進的就是,細節部分還須要優化,行吧,就寫到這裏,隨意了。如需代碼,QQ:1044625113,備註:勻光勻色!orm