把图像中每个像素点的灰度值,按照希望达到的效果,以线性变化的形式,进行变换。
如下图,就是一种分段函数形式,把输入的X轴灰度值变换为输出的Y轴灰度值,只是将灰度值做分段线性变换。分段函数控制点(r1,s1)和(r2,s2)
创建分段函数:
function [ new ] = StretchFunc(original, x1, y1, x2, y2 )
new = original;
w = size(new, 1);
h = size(new, 2);
k1 = y1 / x1;
dk1 = (y2 - y1) / (x2 - x1);
dk2 = (500 - y2) / (500 - x2);
for i = 1 : w
for j = 1 : h
x = new(i, j);
if x < x1
new(i, j) = k1 * x;
elseif x < x2
new(i, j) = dk1 * (x - x1) + y1;
else
new(i, j) = dk2 * (x - x2) + y2;
end
end
end
end
%读入图片
O=imread('F:\Maths\tupian.jpg');
%进行线性变换,设置转折点为(200,100)和(300,400)
NO=StretchFunc(O,200,100,300,400);
%显示原图和变换后的图片
figure,imshow(O);
title('原图');
figure,imshow(NO,[]);
title('变换后');
结果图:
函数功能,画出图像的直方图,并对图像进行直方图均衡
直接读图像tupian.jpg,读到O中
graydis是原始直方图各灰度级像素个数
原始直方图graydispro,利用原始直方图计算原始累计直方图graydispro
t[]计算和原始灰度对应的新的灰度t[],建立映射关系,t坐标代表原始的灰度,t[]代表对应原始坐标的新坐标
new_graydis是统计新直方图各灰度级像素个数
计算新的灰度直方图new_graydispro,利用新的直方图计算新的累计直方图new_graydispro
计算直方图均衡后的新图NO
%读入图片
O=imread('F:\Maths\tupian.jpg');
graydis=zeros(1,256); %设置矩阵大小
graydispro=zeros(1,256);
new_graydis=zeros(1,256);
new_graydispro=zeros(1,256);
[h w]=size(O);
NO=zeros(h,w);
%计算原始直方图各灰度级像素个数graydis
for x=1:h
for y=1:w
graydis(1,O(x,y))=graydis(1,O(x,y))+1;
end
end
%计算原始直方图graydispro
graydispro=graydis./sum(graydis);
subplot(1,2,1);
plot(graydispro);
title('灰度直方图');
xlabel('灰度值');ylabel('像素的概率密度');
%计算原始累计直方图
for i=2:256
graydispro(1,i)=graydispro(1,i)+graydispro(1,i-1);
end
%计算和原始灰度对应的新的灰度t[],建立映射关系
for i=1:256
t(1,i)=floor(254*graydispro(1,i)+0.5);
end
%统计新直方图各灰度级像素个数new_graydis
for i=1:256
new_graydis(1,t(1,i)+1)=new_graydis(1,t(1,i)+1)+graydis(1,i);
end
%计算新的灰度直方图new_graydispro
new_graydispro=new_graydis./sum(new_graydis);
subplot(1,2,2);
plot(new_graydispro);
title('均衡化后的灰度直方图');
xlabel('灰度值');ylabel('像素的概率密度');
%计算直方图均衡后的新图NO
for x=1:h
for y=1:w
NO(x,y)=t(1,O(x,y));
end
end
figure,imshow(O);
title('原图');
figure,imshow(NO,[]);
title('直方图均衡化后的图');
结果:
还没有人评论,抢个沙发吧...