最近有一項工作需要用到大規模影像,鑲嵌成一版圖,后期需要用到勻光勻色,由於需要集成到代碼庫中,所以只能自己實現了。重點參考了論文-《
崔浩, 張力, 艾海濱,等. 利用基准色調的大范圍衛星影像色彩一致性處理算法[J]. 測繪學報, 2017, v.46(12):62-73.》,感謝作者的建議,在此再次表示感謝。不多說了,
在具體實現的時候,我將所有uint16位影像,全部轉為uint8位,采用線性拉伸的方式:
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等等,但是
,個人看法是,這些商業軟件吹噓成分過多,看結果吧:
再看一下細節部分:
整個算法的計算效率還是非常高的,但是有一點需要改進的就是,細節部分還需要優化,行吧,就寫到這里,隨意了。如需代碼,QQ:1044625113,備注:勻光勻色!
接着上一部分沒有寫完的,后續我對勻色算法進行了改進,這一次細節部分更加合理,效果將更加美觀均勻,不多說了,我們看一下結果:
上面是北京二號,右邊是勻色后的北京二號,模板用的是全球30米一版圖,從這里可以看出來,比上一個版本好多了,細節更加完善,效果還算可以,聯系方式上面有了。。。