一些問題請教。 |
尚未結案
|
kikikaka
一般會員 發表:32 回覆:28 積分:12 註冊:2003-09-26 發送簡訊給我 |
各位大哥: 小弟有兩個問題想請問一下:
1. 請問我d[y-1][x-1]*log(d[y-1][x-1])以這樣子的log寫法正確嘛?
因為執行時,一直有錯誤,又不知錯在哪裡。 2.因為我的寫法很笨,例如以3x3來說,中心點是d[y][x],那我就依序把 其他的都寫出來,如d[x-1][y-1].....可是當我想利用較大的遮罩做處理時,例如4x4、8x8,就會顯得很難去寫這個程式,我想請問有其他的程式寫法嘛,讓我不用依序把每個都寫出來? 小弟是新手,請多多見諒。
Graphics::TBitmap *pBitmap = new Graphics::TBitmap(); pBitmap->Assign(Image1->Picture); BTime=timeGetTime(); pixel8bit = new byte*[pBitmap->Height]; d = new unsigned char*[pBitmap->Height]; for (int y = 0; y < pBitmap->Height; y ) { pixel8bit[y] = (Byte *)pBitmap->ScanLine[y]; d[y] = new unsigned char[pBitmap->Width]; for (int x = 0; x < pBitmap->Width; x ) { d[y][x]= pixel8bit[y][x]; } } for (int y = 1; y < pBitmap->Height-1; y ) for (int x = 1; x < pBitmap->Width-1; x ) { g = d[y-1][x-1]*log(d[y-1][x-1]) d[y-1][x]*log(d[y-1][x]) d[y-1][x 1]*log(d[y-1][x 1]) d[y][x-1]*log(d[y][x-1]) d[y][x]*log(d[y][x]) d[y][x 1]*log(d[y][x 1]) d[y 1][x-1]*log(d[y 1][x-1]) d[y 1][x]*log(d[y 1][x]) d[y 1][x 1]*log(d[y 1][x 1]); { if (g > 10000) { pixel8bit[y-1][x-1]=0; pixel8bit[y-1][x]=0; pixel8bit[y-1][x 1]=0; pixel8bit[y][x-1]=0; pixel8bit[y][x]=0; pixel8bit[y][x 1]=0; pixel8bit[y 1][x-1]=0; pixel8bit[y 1][x]=0; pixel8bit[y 1][x 1]=0; } else { pixel8bit[y-1][x-1]=255; pixel8bit[y-1][x]=255; pixel8bit[y-1][x 1]=255; pixel8bit[y][x-1]=255; pixel8bit[y][x]=255; pixel8bit[y][x 1]=255; pixel8bit[y 1][x-1]=255; pixel8bit[y 1][x]=255; pixel8bit[y 1][x 1]=255; } } }發表人 - kikikaka 於 2003/10/20 19:44:50 發表人 - kikikaka 於 2003/10/20 19:48:53 發表人 - kikikaka 於 2003/10/20 23:14:47 |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
kikikaka您好:
請參考下面聯結做適當的修改
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=39009
謝謝您的配合,還有請問一下您的程式最主要是要做什麼壓?
注意,log的內容是不能為0的喔~~ 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~> 發表人 -
|
kikikaka
一般會員 發表:32 回覆:28 積分:12 註冊:2003-09-26 發送簡訊給我 |
|
arisaka_matsuri
高階會員 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
我是路人~~看過source後,發現
pBitmap->Assign(Image1->Picture);這一行就怪怪的,不是應該用 pBitmap->Assign(Image1->Picture->Bitmap);這樣才會複製Image1的Bitmap吧~~ 嗯~程式的動作應該是進行空間遮罩運算,剛好我也在寫這方面的咚咚,所以就攤給大家看看。傳入函數的是要想要進行處理的TBitmap物件的指標,還有遮罩陣列(一律一維)和遮罩陣列大小(元素數) // 空間遮罩運算(8bpp) FUNCTION void __fastcall TForm1::ImageSpatialFilter(Graphics::TBitmap *pSourceBitmap, double *MaskArray, int NumberOfElements) { int row, col; // 計算遮罩的尺寸 int MaskSize = (int)sqrt(NumberOfElements); int deltaMaskSize = (MaskSize - 1) / 2; // 準備指向pSourceBitmap像素記憶體的指標 Byte **ptr1 = new Byte *[pSourceBitmap->Height]; for(row = 0; row < pSourceBitmap->Height; row ) ptr1[row] = (Byte *)pSourceBitmap->ScanLine[row]; // 建立DestBitmap物件 Graphics::TBitmap *pDestBitmap = new Graphics::TBitmap(); pDestBitmap->Assign(pSourceBitmap); // 處理空間遮罩運算,將結果輸出到pDestBitmap Byte *ptr2; double Sum; int index; int r, c; for(row = 0; row < pSourceBitmap->Height; row ) { ptr2 = (Byte *)pDestBitmap->ScanLine[row]; for(col = 0; col < pSourceBitmap->Width; col ) { // 影像邊界處理 if( row < deltaMaskSize || row >= pSourceBitmap->Height - deltaMaskSize || col < deltaMaskSize || col >= pSourceBitmap->Width - deltaMaskSize) Sum = 0; else { // Convolution計算 Sum = 0; index = 0; for(r = -deltaMaskSize; r <= deltaMaskSize; r ) { for(c = -deltaMaskSize; c <= deltaMaskSize; c ) { Sum = (double)ptr1[row r][col c] * MaskArray[index]; index ; } } // 檢查Sum是否超出灰階範圍 if(Sum < 0.0) Sum = 0; if(Sum > 255.0) Sum = 255; } // end of if-else ptr2[col] = (Byte)Sum; } // end of for(col) } // end of for(row) // 拷貝pDestBitmap到pSourceBitmap當成輸出 pSourceBitmap->Assign(pDestBitmap); delete pDestBitmap;而實際上要呼叫的參數如 // 空間遮罩運算:Smoothing Filter 3x3 void __fastcall TForm1::Button1Click(TObject *Sender) { // 定義Smoothing Filter的MaskArray double Scale = 1.0 / 9.0; double MaskArray[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1}; int NumberOfElements = sizeof(MaskArray) / sizeof(MaskArray[0]); for(int i = 0; i < NumberOfElements; i ) MaskArray[i] = Scale * MaskArray[i]; // CALL: ImageSpatialFilter ImageSpatialFilter(pCurrBitmap, MaskArray, NumberOfElements); }因此,關於我上述的處理程式,可以看出用一維陣列的便利。還有,遮罩尺寸一定是奇數*奇數,而且傳入的Bitmap一定是8bpp,不然會ㄔㄨㄚˋ的。 一開始我的寫法也是像你那樣,後來想實現5*5遮罩時就很吃力,所以才改成這個寫法。 各位大人請多指教~~^^ |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
引言: 你好,我的程式,只是對影像進行一些PIXEL值的運算,如果運算出來的值, 超過我給的門檻值,就給予這個範圍的影像全部都是0或255的pixel值。 每次程式執行都會有錯誤,log:SING error。 請問是為什麼啊? 謝謝各位大哥。kikikaka你好: 就像taishyang版主說的,log(x),x不能為0。如果為0,就會出現log:SING error 可以說一下你的方程式數學模型嗎。讓大家也可以幫忙解決像素值為零時狀況。 還有另外附帶一提, log(x)這個函數指的是natural log,也就是數學式ln(),e為底。因為我剛剛差點 被他給騙了, 我以為log(),是2為底的,要注意一下。 一般常用log10(),10為底。但沒有log2()這個函數。 |
kikikaka
一般會員 發表:32 回覆:28 積分:12 註冊:2003-09-26 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
引言: 抱歉,因為我不知道如何在此編輯方程式。 所以方程式打的很亂,請見諒。 我想寫的數學模型,就是下面的方程式。 Σ P(ij)logP(ij) (ij) (ij)是表示下標的部分。 P(ij)就是第(i,j)的像素值,我是想以此方程式計算3x3範圍內值。 還有請問各位高手,遮罩一定只能是奇數×奇數嘛? 不能用偶數×偶數嘛?還是說偶數×偶數要用別的寫法? 謝謝各位。kikikaka你好: 1.) 遮罩用奇數大小原理是基於中心點, 例如3x3中心就是[1,1],如果換成偶數 4x4 就沒有實質的中心點,虛擬中心點[1.5,1.5]不存在。在做銳化柔化等處理 ,就是對中心點做強化或削減的動作, 如果沒有中心點做了也是白做。此類的處 理就需要用到奇數遮罩。其他如量化(quantization)之類的,就不需要中心點 ,就可以用偶數遮罩,且為編碼需要,遮罩大小通常都是偶數。根據你的數學模型 比較屬於統計之類,單數或偶數遮罩應該都可以。 2.) 因為像素0為黑色,所以log(0) 很有可能會發生。小弟有個想法,為不影響統計的 精確度,像素範圍可以做一次shift,也就是0~255,全部加1變成1~256,log2()的結 果為0~8,在值域上會比用0~255好用很多。不過log2()這個函數,可能要另外新增 或是自己用泰勒展開式寫。 參考看看 |
kikikaka
一般會員 發表:32 回覆:28 積分:12 註冊:2003-09-26 發送簡訊給我 |
引言:引言: kikikaka你好: 1.) 遮罩用奇數大小原理是基於中心點, 例如3x3中心就是[1,1],如果換成偶數 4x4 就沒有實質的中心點,虛擬中心點[1.5,1.5]不存在。在做銳化柔化等處理 ,就是對中心點做強化或削減的動作, 如果沒有中心點做了也是白做。此類的處 理就需要用到奇數遮罩。其他如量化(quantization)之類的,就不需要中心點 ,就可以用偶數遮罩,且為編碼需要,遮罩大小通常都是偶數。根據你的數學模型 比較屬於統計之類,單數或偶數遮罩應該都可以。 2.) 因為像素0為黑色,所以log(0) 很有可能會發生。小弟有個想法,為不影響統計的 精確度,像素範圍可以做一次shift,也就是0~255,全部加1變成1~256,log2()的結 果為0~8,在值域上會比用0~255好用很多。不過log2()這個函數,可能要另外新增 或是自己用泰勒展開式寫。 參考看看 >>< face="Verdana, Arial, Helvetica"> JerryKuo你好: 我把像素值都加1以後,就不會有錯誤出現了。 真是謝謝你。 |
Gill
一般會員 發表:0 回覆:1 積分:0 註冊:2003-04-07 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |