計算直方圖均化 轉換函數 & 反轉換函數 的問題已回收

看板MATLAB作者 (Sissy's mate)時間17年前 (2008/11/01 09:07), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
※ [本文轉錄自 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)
文章代碼(AID): #192wleRQ (MATLAB)
文章代碼(AID): #192wleRQ (MATLAB)