線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3023
推到 Plurk!
推到 Facebook!

關於直方圖等化後圖形卻跑不出來的問題

缺席
tresia
一般會員


發表:1
回覆:2
積分:0
註冊:2008-01-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-01-07 00:57:59 IP:140.123.xxx.xxx 訂閱
我現在的題目要求是,讀入一個灰階的圖(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 value = Matrix[i][j];
GrayLevel[value] ;
}

// 將結果放進直方圖中
Series1->Clear();
for ( i=0; i { Series1->Add(GrayLevel[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 重新編輯於 2008-01-07 04:51:07, 註解 無‧
tresia 重新編輯於 2008-01-07 04:54:02, 註解 修改程式碼與加上註解‧
tresia
一般會員


發表:1
回覆:2
積分:0
註冊:2008-01-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-01-07 05:39:36 IP:140.123.xxx.xxx 訂閱
我有試過使用 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-01-17 16:42:51 IP:140.123.xxx.xxx 訂閱
我知道為什麼我使用 global variable 總是失敗了!
因為定義在 .cpp 檔和定義在 .h 檔的不同而已。

所以說如果要定義全域的大變數(尤其是像二維陣列,需要事先 malloc 的)
最好都定義在 .h 檔裡面!
系統時間:2024-05-20 5:04:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!