好了,不說這麼多了,直奔主題,本次分別做了兩次實現,分別是:彩色圖片轉灰度圖直方圖均衡化處理以及彩色圖片的直方圖均衡化處理,大家可以按需觀看。
一、程序源碼
(1)彩色圖片轉灰度圖直方圖均衡化處理:
%讀取圖片
I=imread('test.jpg');
%將圖片轉化成灰度圖片
I=rgb2gray(I);
%顯示原圖像
figure(4),imshow(I);
%獲得灰度圖的長和寬
[M,N]=size(I);
%做直方圖均衡化處理,設置初始參數
average=0;
%做直方圖均衡化處理,創建映射區域
A=zeros(1,256);
%獲得每一個點的灰度值,並判斷其值等於多少
for k=1:256
count=0;
for i=1:M
for j=1:N
value=I(i,j);
%統計灰度值
if value==k
count=count+1;
end
end
end
%畫出圖像灰度直方圖
figure(1),line([k,k],[0,count]);
%直方圖均衡化處理
count=count/(M*N*1.0);
average=average+count;
%獲得灰度映射
A(k)=average;
%畫出均衡化後的直方圖
figure(2),line([k,k],[0,average]);
end
%累計分佈取整,+0.5等於四捨五入,也就是取整
A=uint8(255.*A+0.5);
%進行直方圖反映射,得到處理後的原圖像
for i=1:M
for j=1:N
I(i,j)=A(I(i,j));
end
end
%展示處理後圖像
figure(3),imshow(I);
實驗結果截圖:
(2)彩色圖片的直方圖均衡化處理
彩色圖片的直方圖均衡化處理與灰度圖的處理方法一樣,不同的地方在於要分別把R、G、B層做一次處理,也就是處理三次,而灰度圖像就只需要處理灰度值就行,這就是兩者唯一的不同。因此,原理懂了,就不難實現了
%讀取圖片
I=imread('test.jpg');
figure(7),imshow(I);
%獲取圖片的長、寬和層數(其實等於三,R、G、B三層)
[M,N,G]=size(I);
result=zeros(M,N,3);
%獲得每一層每一個點的RGB值,並判斷其值等於多少
for g=1:3
A=zeros(1,256);
%每處理完一層,參數要重新初始化爲0
average=0;
for k=1:256
count=0;
for i=1:M
for j=1:N
value=I(i,j,g);
if value==k
count=count+1;
end
end
end
figure(g),line([k,k],[0,count]);
count=count/(M*N*1.0);
average=average+count;
A(k)=average;
figure(g+3),line([k,k],[0,average]);
end
A=uint8(255.*A+0.5);
for i=1:M
for j=1:N
I(i,j,g)=A(I(i,j,g)+0.5);
end
end
end
%展示處理效果
figure(8),imshow(I);
實驗結果截圖:
以上,就是如何運用line()函數來畫直方圖以及如何通過對直方圖進行處理來處理圖片的運用啦。個人覺得不足的地方在於for循環用的有些多,程序看起來有點臃腫,希望有大神能夠指點一二。