Loading

MATLAB图像增亮与非线性拉伸

%======================================================
% MPM灰度均衡
% f1=imadjust(f,[low_in  high_in],[low_out  high_out],gamma)
%=======================================================

clc
close all
clearvars
tic

[FileName, FilePath]=uigetfile('*.jpg;*.png;*.tif;*.img;*.bmp;','请选择一幅参考图片');
image_name = [FilePath FileName];

Iorg = imread(image_name);
[rI, cI] = size(Iorg(:,:,1));

%-- 判断图像信息所在的通道 --%
ifocus = zeros(1,3);      % 需要处理的分量,初始值为0,对应分量有值时,元素变为1  [0,0,0]
for i=1:3   % i=1红色 ; i=2绿色; i=3蓝色 
   Inidraw = Iorg(:,:,i);    %通道读取
   Meani = mean(Inidraw(:)); %先把矩阵转化为向量,然后计算均值
   if(Meani>1)  % 该分量有信息,理论上应该大于0就说明有信息,但是为了去噪,设成略大的值
       ifocus(i) = 1;
   end
end
%---------------------------%

[r,c,v] = find(ifocus~=0);

%%
% 只处理有信息的分量
Ir = zeros(rI, cI, 3); 
for i=1:length(c)
    Ipi = Iorg(:,:,c(i));  
    
    %-- !!!!整体加亮!!!! --%
    CL = 60;    
    Ipi_CL = Ipi + CL;
    %-----------------------------%
    
    %-- !!!!非线性灰度拉伸!!!!--%
    % gamma < 1 低灰度区强拉伸,高灰度区弱拉伸甚至压缩
    Ipi_histequ = imadjust(Ipi_CL, [65/255, 150/255], [40/255, 255/255], 0.8);
    %---------------------------------%
    
    Ir(:,:,i) = Ipi_histequ;
   
    %-- 灰度直方图(原图) --%
    [count_pi, x_pi] = imhist(Ipi);   % xn是灰度值,count_n是出现的次数
    [count_ri, x_ri] = imhist(Ir(:,:,i));
    f_pi = count_pi/(rI*cI);          % 出现次数归一化
    f_ri = count_ri/(rI*cI);

    figure
    subplot(2,1,1);
%     stem(x_pi, f_pi, 'b.');
    imhist(Ipi);
    title('灰度直方图-原图');
    subplot(2,1,2);
%     stem(x_ri, f_ri, 'r.');
    imhist(uint8(Ir(:,:,i)));
    title('灰度直方图-均衡后');
    %-----------------------------%
   
    %-----------------------------%
    figure
    IpiShow = zeros(rI,cI,3);
    IpiShow(:,:,i) = Ipi;
    imshow(uint8(IpiShow));   

    figure
    IriShow = zeros(rI,cI,3);
    IriShow(:,:,i) = Ipi_histequ;
    imgs = uint8(IriShow);
    imshow(uint8(IriShow));
    %-----------------------------%
    
    %-- 保存图像 --%
    switch i
        case 1
            ChannelName = 'R-';
        case 2
            ChannelName = 'G-';
        case 3
            ChannelName = 'B-';
    end
    
    rfpi = [FilePath, 'org-', ChannelName, FileName];
    imwrite(uint8(IpiShow), rfpi);
    
    rfri = [FilePath, 'Heq-', ChannelName, FileName];
    I1 = imgs(:,:,1);
    imwrite(I1, rfri);
    %--------------%
end








toc

 

posted @ 2019-06-03 23:40  ZHGQCN  阅读(755)  评论(0)    收藏  举报