關於直方圖等化後圖形卻跑不出來的問題 |
缺席
|
tresia
一般會員 發表:1 回覆:2 積分:0 註冊:2008-01-06 發送簡訊給我 |
我現在的題目要求是,讀入一個灰階的圖(Image1)做直方圖等化,
但是等化完之後我卻無法順利的將等化後的圖形顯示在Image2 中。 應該說,顯示出來的結果是一片黑? 灰階圖形可以順利的統計到直方圖中,也可以順利的顯示出來。 (不過爬了一下文,我並不是使用ScanLine的方法做的) 不過做完直方圖等化之後就無法將圖放回去? 我的程式碼有點多,完整的程式碼如果有需要我在貼上來! 先貼部份: 1. 我把灰階圖形統計到直方圖的方法: [code cpp] // 這邊先 New 一個二維陣列 Matrix // 讀取 Image1 的 Pixels 存放至 Matrix for (i=0; i for (j=0; j Matrix[i][j] = GetRValue(Image1->Canvas->Pixels[j][i]); // RedLevel = GreenLevel = YellowLevel = GrayLevel 對灰階圖片而言 } } // 累加所有的灰階值至 GrayLevelArray 中 int value = 0; for (i=0; i for (j=0; j GrayLevel[value] ; } // 將結果放進直方圖中 Series1->Clear(); for ( i=0; i } [/code] 2. 直方圖等化之後要放入Image2的寫法: [code cpp] // 計算每個 pixel 出現的機率 for ( i=0; i< PIXELS; i ) Intensity[i] = Intensity[i]/(ImageH*ImageW); // 計算機率密度函數 (P.D.F) // 對每個 Pixels 做累加的動作 for ( i=1; i< PIXELS; i ) Intensity[i] = Intensity[i] Intensity[i-1] ; for ( i=0; i< PIXELS; i ) Intensity[i] = Intensity[i]* (PIXELS -1); // 把計算後的結果放回圖形 TempMatrix 中! int buffer; // 暫存 for ( i=0; i< ImageH; i ) { for ( j=0; j< ImageW; j ) { buffer = TempMatrix[i][j]; TempMatrix[i][j] = int (Intensity[buffer]); } } // 把灰階值轉換為圖形 for ( i=0; i< ImageH; i ) { for ( j=0; j< ImageW; j ) { Image2->Canvas->Pixels[j][i] = TColor(RGB(TempMatrix[i][j], TempMatrix[i][j], TempMatrix[i][j])); } } [/code] 我猜我是在最後兩個步驟做錯的! 不過這個方法是參考之前學長的程式碼,他們的程式跑的很順利! 而我的程式碼在做完直方圖等化這一段 trace 過了沒有問題, 但是不知道最後要把等化後的圖形顯示出來要怎麼做! |
tresia
一般會員 發表:1 回覆:2 積分:0 註冊:2008-01-06 發送簡訊給我 |
我有試過使用 ScanLine 來處理將直方圖等化的後結果,
但是放入 Image2 之後還是一片黑。 最後選擇使用學長們的程式碼就解決了! 我和學長們的程式碼只差在, 我處理直方圖等化後的結果所置放的二維陣列是全域函數, 可是學長是額外在new 一個新的 Local 的二維陣列變數。 我還是不懂為什麼只是改成全域變數圖形就跑不出來呢? 學長的程式碼: [code cpp] void __fastcall TForm1::GlobalButtonClick(TObject *Sender) { float graylevel[256] = {0}; int temp; int **newData; // 重新宣告個新矩陣 newData = new int *[ImageW]; for(int i = 0; i < ImageW; i ){ newData[i] = new int[ImageH]; } // 新矩陣的值會等於原本的 for(int i = 0; i < ImageW ; i ){ for(int j = 0; j < ImageH ; j ){ newData[i][j] = Matrix[i][j]; } } // 這邊一樣是做資料統計的動作 for(int i = 0 ; i < ImageW ; i ){ for(int j = 0; j < ImageH ; j ){ temp = newData[i][j]; graylevel[temp] ; } } // 算出pixels 出現機率 for(int i = 0 ; i < 256 ; i ) graylevel[i]=(graylevel[i]/((ImageW)*(ImageH))); // 連續累加 for(int i = 1 ; i < 256 ; i ) graylevel[i]=graylevel[i] graylevel[i-1]; // 乘回去 for(int i = 0 ; i < 256 ; i ) graylevel[i] = graylevel[i]*255; // 放回 Matrix 中 for(int i = 0; i < ImageW; i ) for(int j = 0; j < ImageH; j ){ temp=newData[i][j]; Matrix[i][j] = int(graylevel[temp]); } // 把灰階值放入圖片中 for(int i = 0; i < ImageW; i ) for(int j = 0; j < ImageH; j ) Image2->Canvas->Pixels[j][i] = TColor(RGB(Matrix[i][j], Matrix[i][j], Matrix[i][j])); // 清空graylevel 中的東西 for(int i = 0; i < 256; i ){ graylevel[i] = 0; } //顯示改變後的圖在image2 for(int i = 0 ; i < ImageW ; i ){ for(int j = 0; j < ImageH ; j ){ temp = Matrix[i][j]; graylevel[temp] ; } } Series2->Clear(); for(int i = 0; i < 256; i ){ Series2->Add(graylevel[i]); } } [/code] |
tresia
一般會員 發表:1 回覆:2 積分:0 註冊:2008-01-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |