function outImg = GrayScaleTransform(img)
[ylen, xlen] = size(img);
bins = 0:65535;
histcount = histc(img(:)', bins);
%清除临时变量
clear bins max_val min_val;
% 直方图裁剪,计算左值和右值
[l_val, r_val] = calc_lr_val(histcount, xlen*ylen, 0.02);
% 根据左值和右值,将图像由16位映射至8位
outImg = img_map(img, l_val, r_val);
end
function [img_8bit] = img_map(img_16bit, l_val, r_val)
[xlen, ylen, c] = size(img_16bit);
img_8bit = zeros(xlen, ylen);
% fprintf(' ... ... ... ... ... ... ... ... ...\n');
% fprintf(' ... IMG MAPPING FROM 16BIT TO 8BIT \n');
% fprintf(' ... Img mapping begin ... ... \n');
% 按照左右值映射
img_8bit = (img_16bit - l_val).*(255/(r_val-l_val));
img_8bit = uint8(round(img_8bit));
% fprintf(' ... Img mapping finshied !!! !!! \n\n');
end
function [l_val, r_val] = calc_lr_val(histcount, tt, per)
% fprintf(' ... ... ... ... ... ... ... ... ...\n');
% fprintf(' ... CALC LEFT AND RIGHT VALUE \n');
per_tt = tt*per; % 按百分比裁剪的像素个数
% 计算左值
tmp = 0;
for i = 1:length(histcount)
tmp = tmp + histcount(i);
if tmp >= per_tt
l_val = i;
break;
end
end
% 计算右值
tmp = 0;
for i = 1:length(histcount)
tmp = tmp + histcount(length(histcount)-i+1);
if tmp >= per_tt
r_val = length(histcount)-i+1;
break;
end
end
% fprintf(' ... Stretch Percentage is %d%%\n', per*100);
% fprintf(' ... Left Val is %d \n', l_val);
% fprintf(' ... Right Val is %d \n', r_val);
% fprintf(' ... ... ... ... ... ... ... ... ...\n\n');
end
Matlab实现遥感图像2%线性拉伸
最新推荐文章于 2022-12-28 16:36:38 发布