📄 code1.m
字号:
img1=imread('lenna.bmp');
A=double(img1);
B=zeros(256);
C=zeros(256);
%=======================均衡化=====================
rate=be_count(A);%调用计算图象灰度直方图函数
add_rate=rate;
for i=2:256
add_rate(i)=add_rate(i)+add_rate(i-1);
%累积直方图
end
ave=ceil(add_rate.*(255-1)+0.5);%均衡化算子
for i=1:256
for j=1:256
k=A(i,j)+1;
B(i,j)=ave(k);%均衡化后的图像像素值
end
end
k=be_count(B);%调用计算均衡化后的图象灰度直方图函数
%-------输出
img2=uint8(B);
l=0:255;
subplot(4,2,1);plot(l,rate);
subplot(4,2,3);plot(l,k);
subplot(4,2,2);imshow(img1);title('原图');
subplot(4,2,4);imshow(img2);title('均衡化');
%=====================单映射======================
C=floor(A./5);
rate2=be_count2(C);%调用计算图象灰度(分成52段)直方图函数
add_rate2=rate2;
for i=2:52
add_rate2(i)=add_rate2(i)+add_rate2(i-1);
%累积直方图
end
img3=uint8(C);
std=[ones(1,9)*0.1,0.1,ones(1,9)*0.2,0.2,ones(1,10)*0.3,0.3,ones(1,10)*0.3,0.3,ones(1,9)*0.1,0.1];%规定化直方图
add_std=[ones(1,9)*0.1,0.1,ones(1,9)*0.3,0.3,ones(1,10)*0.6,0.6,ones(1,10)*0.9,0.9,ones(1,9)*1,1];%"累计"规定化直方图
for i=1:52
if add_rate2(i)<=0.2 p(1)=i;%离0.1最近,记录
elseif add_rate2(i)<=0.45 p(2)=i;%离0.3最近,记录
elseif add_rate2(i)<=0.75 p(3)=i;%离0.6最近,记录
elseif add_rate2(i)<=0.95 p(4)=i;%离0.9最近,记录
else break;
end
end
for j=1:256
for i=1:256
l=C(i,j)+1;%k为1--52的数,表示A(i,j)所属的段号(分段的下标)
if l<=p(1)%映射到0--45
C(i,j)=C(i,j).*(45/p(1));
elseif l<=p(2)%映射到46--95
C(i,j)=C(i,j).*(95/p(2));
elseif l<=p(3)%映射到96--150
C(i,j)=C(i,j).*(150/p(3));
elseif l<=p(4)%映射到151--205
C(i,j)=C(i,j).*(205/p(4));
elseif l<=42
C(i,j)=205;
else C(i,j)=C(i,j)*5;
end
end
end
%-------输出
img4=uint8(C);
l=0:5:255;
subplot(4,2,5);plot(0:255,[rate2 zeros(1,204)]);
subplot(4,2,7);stem(l,(std));
subplot(4,2,6);imshow(img3);title('分段原图');
subplot(4,2,8);imshow(img4);title('单映射规定化');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -