[問題] 關於影像二值化??

看板C_and_CPP作者 (kiy)時間12年前 (2011/10/05 22:36), 編輯推噓4(4015)
留言19則, 5人參與, 最新討論串1/3 (看更多)
各位前輩好!!小弟是用BCB作的二值化,寫了個副程式, 想用圖的所有像素灰階值相加除以總像素數目來作門檻! (門檻=所有像素灰階值相加/總像素數目) 程式碼如下 void tw(Byte **a) { int Bsum; float Background; for(int i = 0; i < ImgWidth; i++) { for(int j = 0; j < ImgHeight; j++) { Background=(Bsum+=a[i][j])/((ImgHeight)*(ImgWidth)); } } for(int i = 0; i < ImgWidth; i++) { for(int j = 0; j < ImgHeight; j++) { if( a[i][j] > Background ) a[i][j] = 0; else a[i][j] = 255; } } } 但是編譯結果好像在計算門檻那一行爆掉了... 希望前輩們能指正一下小弟~~感謝!!拜託~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.171.197.121

10/05 22:43, , 1F
(Bsum+=a[i][j])/((ImgHeight)*(ImgWidth)); 整數/整數
10/05 22:43, 1F

10/05 22:52, , 2F
樓上大大的意思可以詳細一點嗎??
10/05 22:52, 2F

10/05 22:57, , 3F
轉型
10/05 22:57, 3F

10/05 23:00, , 4F
我忘記int夠不夠用 XD
10/05 23:00, 4F

10/05 23:01, , 5F
我其實比較好奇,他的 a[i][j] 是存什麼。
10/05 23:01, 5F

10/05 23:02, , 6F
Bsum倒底要做什麼用的? 不是都要給Background了嗎?
10/05 23:02, 6F

10/05 23:03, , 7F
int 最差情況容許 840萬個點為 0xff (ymean)
10/05 23:03, 7F

10/05 23:03, , 8F
Byte a[i][j], 8bit灰階圖吧
10/05 23:03, 8F

10/05 23:05, , 9F
Bsum是這張圖pixel_value總合,而 background 是平均.
10/05 23:05, 9F

10/05 23:10, , 10F
目前Bsum沒用到,可以先拿掉.
10/05 23:10, 10F

10/05 23:11, , 11F
假如要另一種方式的話,Bsum改用更大的型態,雙層for做完
10/05 23:11, 11F

10/05 23:12, , 12F
後,再去除以面積. (比起那一行好一點)
10/05 23:12, 12F

10/05 23:41, , 13F
另一種就是不要全加再算平均 這樣也不用擔心會溢位的問題
10/05 23:41, 13F

10/05 23:47, , 14F
前題是要先統計(我似乎想太多了...)
10/05 23:47, 14F

10/06 00:09, , 15F
就數學的觀點,先加完後再平均,跟加每一個平均值,值域是
10/06 00:09, 15F

10/06 00:09, , 16F
不變的.
10/06 00:09, 16F

10/06 00:10, , 17F
可是,程式這邊有先天值域的限制,再加上運算速度的考量,
10/06 00:10, 17F

10/06 00:11, , 18F
所以... 就這樣XD
10/06 00:11, 18F

10/06 00:48, , 19F
http://goo.gl/qLFcb 參考二值化部份
10/06 00:48, 19F
文章代碼(AID): #1EZ6j-4j (C_and_CPP)
文章代碼(AID): #1EZ6j-4j (C_and_CPP)