如何在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('直方圖均衡化后的圖');
結果: