调整图像- 自动对比度、自动色阶算法

参考本文算法 使用Matlab实现。

clc;
close all;
clearvars;
%调整图像---自动色阶算法
img = imread('D:/picture/lena.jpg');
[row,col,~] = size(img);
PixelAmount = row * col;
HighCut = 0.01;
LowCut = 0.01;
rimg = img(:,:,1);
gimg = img(:,:,2);
bimg = img(:,:,3);
rhist = imhist(rimg,256);
ghist = imhist(gimg,256);
bhist = imhist(bimg,256);
%red channel image
MinRed = 0;MaxRed = 255;
MinGreen = 0;MaxGreen = 255;
MinBlue = 0;MaxBlue = 255;
sumval = 0;
for ii = 0:255
    sumval = sumval + rhist(ii + 1);
    if sumval >= PixelAmount * LowCut
        MinRed = ii;
        break;
    end
end
sumval = 0;
for ii = 255:-1:0
    sumval = sumval + rhist(ii + 1);
    if sumval >= PixelAmount * HighCut
        MaxRed = ii;
        break;
    end
end

%green channel image
sumval = 0;
for ii = 0:255
    sumval = sumval + ghist(ii + 1);
    if sumval >= PixelAmount * LowCut
        MinGreen = ii;
        break;
    end
end
sumval = 0;
for ii = 255:-1:0
    sumval = sumval + ghist(ii + 1);
    if sumval >= PixelAmount * HighCut
        MaxGreen = ii;
        break;
    end
end

%blue channel image
sumval = 0;
for ii = 0:255
    sumval = sumval + bhist(ii + 1);
    if sumval >= PixelAmount * LowCut
        MinBlue = ii;
        break;
    end
end
sumval = 0;
for ii = 255:-1:0
    sumval = sumval + bhist(ii + 1);
    if sumval >= PixelAmount * HighCut
        MaxBlue = ii;
        break;
    end
end

RedMap = zeros(1,256);
GreenMap = zeros(1,256);
BlueMap = zeros(1,256);
for ii = 0:255
    if ii <MinRed
        RedMap(ii + 1) = 0;
    elseif ii>MaxRed
        RedMap(ii + 1) = 255;
    else
        RedMap(ii + 1) = round((ii - MinRed)/(MaxRed - MinRed) * 255);
    end
    
    if ii <MinGreen
        GreenMap(ii + 1) = 0;
    elseif ii>MaxGreen
        GreenMap(ii + 1) = 255;
    else
        GreenMap(ii + 1) = round((ii - MinGreen)/(MaxGreen - MinGreen) * 255);
    end
    
    if ii <MinBlue
        BlueMap(ii + 1) = 0;
    elseif ii>MaxBlue
        BlueMap(ii + 1) = 255;
    else
        BlueMap(ii + 1) = round((ii - MinBlue)/(MaxBlue - MinBlue) * 255);
    end
end
dst_3map = img;
for ii =1:row
    for jj = 1:col
        temp =double( dst_3map(ii,jj,1) );
        dst_3map(ii,jj,1) = RedMap(temp + 1);
        temp =double( dst_3map(ii,jj,2) );
        dst_3map(ii,jj,2) = GreenMap(temp + 1);
        temp =double( dst_3map(ii,jj,3) );
        dst_3map(ii,jj,3) = BlueMap(temp + 1);
    end
end
figure;
subplot(2,3,1);imshow(img);title('original image');
subplot(2,3,2);imshow(dst_3map);title('processed image');
subplot(2,3,3);stem(0:255,RedMap,'marker','none');title('red channel map function');
subplot(2,3,4);stem(0:255,GreenMap,'marker','none');title('green channel map function');
subplot(2,3,5);stem(0:255,BlueMap,'marker','none');title('blue channel map function');
%%
%调整图像---自动对比度算法
if MinBlue < MinGreen
    Min = MinBlue;
else
    Min = MinGreen;
end

if MinRed < Min
    Min = MinRed;
end
if MaxBlue > MaxGreen
    Max = MaxBlue;
else
    Max = MaxGreen;
end
if MaxRed > Max
    Max = MaxRed;
end
Map = zeros(1,256);
for ii = 0:255
    if ii < Min
        Map(ii + 1) = 0;
    elseif ii>Max
        Map(ii + 1) = 255;
    else
        Map(ii + 1) = round((ii - Min)/(Max - Min) * 255);
    end
end
dst_1map = img;
for ii =1:row
    for jj = 1:col
        temp =double( dst_1map(ii,jj,1) );
        dst_1map(ii,jj,1) = Map(temp + 1);
        temp =double( dst_1map(ii,jj,2) );
        dst_1map(ii,jj,2) = Map(temp + 1);
        temp =double( dst_1map(ii,jj,3) );
        dst_1map(ii,jj,3) = Map(temp + 1);
    end
end
figure;
subplot(2,2,1);imshow(img);title('original image');
subplot(2,2,2);imshow(dst_1map);title('processed image');
subplot(2,2,3);stem(0:255,Map,'marker','none');title('map function');





评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值