計算直方圖均化 轉換函數 & 反轉換函數 的問題已回收
※ [本文轉錄自 Programming 看板]
題目:求灰階圖片直方圖均化的轉換與反轉換函數,
並且實際對一個圖片做處理
轉換函數要自己寫,不可以用image toolbox
遇到的問題:反轉換(應用於直方圖等化)不成功
問題詳細描述:
轉換函數的部份我「應該」寫出來了,
可是反轉換函數怎麼測試就是不對,
畫出來的轉換函數曲線圖是錯的,
反轉換的圖片也錯的
我的想法是...
當初這個灰階值在轉換曲線被轉換為多少,
那麼在反轉換函數中,反過來記錄就對了
然後就可以求得轉換函數Hc和反轉換函數Hcp,
Hc和Hcp都是一維陣列,就是要轉換數值的對應表格
如果要做直方圖均化,
寫法就是:
img(i,j) = Hc( img(i,j)+1 )
如果要做img1等化到img2:
img(i,j) = Hcp2( Hc1(img(i,j)+1 )
測試的結果是,
自己對自己做等化,
也就是轉換過去再轉回來是ok的
(自己對自己做直方圖等化是成功的)
如果是img1等化到img2...
結果是"差不多"對,
因為...
等化後img1的灰階分布累加圖大約等於img2
可是img1的某一個灰階度的像素數量會飆高...
導致其他灰階值的像素都降低了
(不過img1等化後的灰階分布直方圖,
和img2的很像,算是半成功吧)
以下是求轉換函數的程式碼,
(程式是matlab)
==================================================
function [Hc,Hcp]=getHc(imgfile)
% 讀取圖片和相關資訊的部份
info=imfinfo(imgfile);
img=imread(imgfile);
try
g=rgb2gray(img);
catch
g=img;
end
tol=info.Width*info.Height;
scale=2^info.BitDepth;
% 真正開始計算的部份
% Hc=一維陣列,灰階轉換函數的數值
Hcp=zeros(1,scale); % 反轉換函數
% 取得圖片的灰階分布直方圖
Hc=getGLH(imgfile);
% 灰階值/總像數數量 (每個灰階像素的平均數量)
GLIV=scale/tol;
% 計算灰階分布直方圖的累加數值
for i=2:scale
Hc(i)=Hc(i)+Hc(i-1);
end
% 計算直方圖均化轉換函數
for i=1:scale
newG=uint8(Hc(i)*GLIV);
Hc(i)=newG;
% 順便紀錄反轉換函數
Hcp(newG+1)=i;
end
==================================================
用下面程式碼可以畫出
轉換與反轉換函數的曲線圖
[a,b]=getHc('m.bmp');
subplot(1,2,1)
plot(a)
subplot(1,2,2)
plot(b)
不知道我是邏輯錯誤,
還是程式寫錯
還是兩個都錯了?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.68.92.156
※ 編輯: costbook 來自: 203.68.92.156 (11/01 09:09)
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章