参考本文算法 使用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');