MATLAB 图像处理-线性变换和直方图均衡
如何在MATLAB中对于已经被表示成数字矩阵的图像进行处理
一、 灰度拉伸变换
把图像中每个像素点的灰度值,按照希望达到的效果,以线性变化的形式,进行变换。
如下图,就是一种分段函数形式,把输入的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('直方图均衡化后的图');
结果: