1. 程式人生 > >Matlab 彩色圖片直方圖均衡化處理 line()函式實現

Matlab 彩色圖片直方圖均衡化處理 line()函式實現

好了,不說這麼多了,直奔主題,本次分別做了兩次實現,分別是:彩色圖片轉灰度圖直方圖均衡化處理以及彩色圖片的直方圖均衡化處理,大家可以按需觀看。

一、程式原始碼
(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迴圈用的有些多,程式看起來有點臃腫,希望有大神能夠指點一二。