直方圖規定化的編程實現

題目

![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200406112735923.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Nsb3Zlcl9wb2Z1,size_16,color_FFFFFF,t_70


matlab代碼

代碼是自己碼的,用最簡單粗暴的方法(毫無技巧可言),而且還不一定對。。。。僅供參考
裏面我設置了一個ratio值,是用來控制映射的。不同的ratio值結果會不一樣噢,大家注意~

%原始圖像,像素的最高亮度級爲160
R=[1 7 8 9 10 11 14;
    5 2 6 7 14 12 15;
    3 4 7 8 6 9 11;
    2 1 4 7 8 8 9;
    8 4 5 9 11 12 10;
    8 10 11 15 16 10 13;
    13 6 9 16 13 12 10]*10;
%統計像素矩陣中各像素出現的次數
R1=tabulate(R(:));  %返回:像素值 出現次數 佔比%
R2=R1(:,1); %I1的第一行,0160
R3=R1(:,2)/49;  %佔比,相當於I3=I1(:,3)/100
[m_r,n_r]=size(R2); %[160,1]
r=[];pr=[]; %for循環後,篩選出圖像中存在的亮度級,r裝像素亮度級,pr裝亮度級對應的佔比
for i=1:m_r
    if R3(i,1)~=0
        r(end+1)=R2(i,1);
        pr(end+1)=R3(i,1);
    end
end
figure
subplot(3,1,1);
stem(r,pr);
axis([0 255 0 0.3]);
title("原圖像的灰度直方圖");
xlabel("r");ylabel("pr");

%參考圖像
Z=[10 9 11 12 10 11 10;
    9 10 11 12 11 12 11;
    9 11 10 12 13 14 13;
    12 12 10 13 14 15 13;
    11 13 14 16 16 14 15;
    14 12 12 15 16 15 14;
    13 12 13 16 13 14 15]*11;
Z1=tabulate(Z(:));
Z2=Z1(:,1);
Z3=Z1(:,2)/49;
[m_z,n_z]=size(Z2);
z=[];pz=[];
for i=1:m_z
    if Z3(i,1)~=0
        z(end+1)= Z2(i,1);
        pz(end+1)= Z3(i,1);
    end
end
subplot(3,1,2);
stem(z,pz);
axis([0 255 0 0.3]);
title("參考圖像的灰度直方圖");
xlabel("z");ylabel("pz");

[m_i1,n_i1]=size(pr);   %返回[1,16]
[m_j1,n_j1]=size(pz);   %返回[1,8]

ratio=0.9;  %控制閾值,如果當前的temp_v還夠放90%的temp_r,那就整個塞進去,of course你也可以自己選比例值
v=[];

num_r=1;num_z = 1;  %“指針”初始化,指向第一個位置
temp_r=pr(num_r);temp_v=pz(num_z);  %初始化,r和z都指向第一個填充位
num_r=num_r+1;num_z=num_z+1;    %指針指向下一個位置

while (num_z<=n_j1)
    if(temp_v<(temp_r*ratio))   %z在這個填充位的容量太小,不適合放東西,跳到下一個
        v=[v 0];    %v可以不打分號,看看輸出和自己計算的一不一樣
        temp_v=temp_v+pz(num_z);
        num_z =num_z+ 1;
    end
    if(temp_v>=(temp_r*ratio))
        if(temp_v==(temp_r*ratio))  %剛好匹配
            v=[v temp_r];
            temp_r=pr(num_r);
            num_r=num_r+1;
            temp_v=pz(num_z);
            num_z =num_z+1;
        else    %這個填充位置容量大,看看能不能多放幾個
            
            load=temp_r;
            while(temp_v>=(load*ratio))
                temp_r=load;
                if(num_r<=n_i1) %如果r還有下一位
                    load=temp_r+pr(num_r);
                    num_r=num_r+1;
                end
            end
            num_r=num_r-1;  %加多了,回退一位
            v=[v temp_r];
            temp_v=temp_v-temp_r;
            if(num_r<=n_i1)
                temp_r=pr(num_r);
                num_r=num_r+1;
            end
            temp_v=temp_v+pz(num_z);
            num_z=num_z+1;
        end
        
    end
    
end
v=[v temp_r];


subplot(3,1,3);stem(z,v);
axis([0 255 0 0.3]);
title("原圖像經過直方圖規定化的灰度直方圖");
xlabel("v");ylabel("pv");


運行結果對比

ratio=0.7

在這裏插入圖片描述

ratio=0.8

在這裏插入圖片描述

ratio=0.85

在這裏插入圖片描述

ratio=0.9

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章