討論區快速選單
知識庫快速選單
軟體開發過程中有哪些資安漏洞? 網路投保旅行平安險 討論區最近新進100則主題
[ 回上頁 ] [ 討論區發言規則 ]
如何實作灰階圖片轉直方圖等化
更改我的閱讀文章字型大小
作者 : shin0202shin(信)
[ 貼文 18 | 人氣 7496 | 評價 0 | 評價/貼文 0 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/14 上午 01:37:15
我現在要針對灰階圖片進行直方圖等化
我將灰階度0~255的出現次數分別累加起來
然後個別除以圖片像素總數得到機率值
將這些機率值以"目前項=前面幾項累加"的方式得到新的機率值
但是接下來要乘255
我不懂為什麼要成255
還是我這方法是錯的?
麻煩各位大大幫忙一下
作者 : crazystar(CrazyStar) C++ Builder優秀好手貼文超過200則人氣指數超過10000點
[ 貼文 449 | 人氣 17326 | 評價 2270 | 評價/貼文 5.06 | 送出評價 89 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人shin0202shin註記此篇回應為很有道理 2007/8/14 下午 04:34:44

>我現在要針對灰階圖片進行直方圖等化
>1. 我將灰階度0~255的出現次數分別累加起來
>2. 然後個別除以圖片像素總數得到機率值
>3. 將這些機率值以'目前項=前面幾項累加'的方式得到新的機率值
>4. 但是接下來要乘255
>我不懂為什麼要成255, 還是我這方法是錯的?
>麻煩各位大大幫忙一下

參考一下:

其實, 到步驟1結束, 就已經可以畫出直方圖了.
後面的那些步驟, 我覺得應該只是為了某個後續目的 (例如, 進一步的分析圖檔等) 才做的.
(這個目的是什麼, 可能因分析者而定, 很抱歉我無法回答)

所以若你的目的只是畫出直方圖而已, 那到步驟1就OK了, 可以不用去管這個 "乘255" 的動作.

: )
作者 : shin0202shin(信)
[ 貼文 18 | 人氣 7496 | 評價 0 | 評價/貼文 0 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/14 下午 11:22:54
謝謝你的回答
但是我看有些論文有做這方面的處理
所以想做做看

這是我的CODE,我是用C#寫的
     private void button1_Click(object sender, EventArgs e)
     {
     Image smallImg = null;
     OpenFileDialog openFileDilog = new OpenFileDialog();
     openFileDilog.Filter = "BMP(*.bmp)|*.bmp";

     if (openFileDilog.ShowDialog() == DialogResult.OK)
     {
     Bitmap btmp = new Bitmap(openFileDilog.FileName);
     int[,] buffer = new int[btmp.Height,btmp.Width];
     double[] count1 = new double[256];
     double[] p = new double[256];
     double[] newp = new double[256];
     double[] gray_level = new double[256];
     int count = 0;
     for (int x = 0; x < btmp.Height; x++) //讀取像素迴圈
     {

     for (int y = 0; y < btmp.Width; y++)
     {
     Color c = btmp.GetPixel(y, x);
     for (int i = 0; i < 256; i++) //0~255種變化
     {
     if (c.R == i)
     {
     count1[i] = count1[i] + 1;//累加
     }
     }
     }
     }
     int v = btmp.Height * btmp.Width;
     for (int j = 0; j < 256; j++) //各像素的機率值
     {
     p[j] = count1[j] / v;
     }
     for (int m = 0; m < 256; m++) //前面項機率累加
     {
     for (int n = 0; n <= m; n++)
     {
     newp[m] = newp[m] + p[n];
     }

     }
     for (int l = 0; l < 256; l++) //新機率值乘255
     {
     gray_level[l] = newp[l] * 255;
     }
     //for (int z = 0; z < 256; z++)
     //{
     for (int k = 0; k < btmp.Height; k++)
     {
     for (int u = 0; u < btmp.Width; u++)
     {
for(int z = 0; z < 256 ; z++)
{
Color t = btmp.GetPixel(u , k);

if (t.R == z) //若像素值等於0~255其中一個,用新值取代
{
btmp.SetPixel(u, k, Color.FromArgb(System.Convert.ToInt32(gray_level[z]),System.Convert.ToInt32( gray_level[z]),System.Convert.ToInt32( gray_level[z])));
}
}

     }
     }
     //}
     smallImg = btmp;
     }
     SaveFileDialog saveFileDialog = new SaveFileDialog();
     saveFileDialog.Filter = "BMP(*.bmp)|*.bmp";

     if (saveFileDialog.ShowDialog() == DialogResult.OK)
     {
     smallImg.Save(saveFileDialog.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
     }
     }
    }
}
作者 : crazystar(CrazyStar) C++ Builder優秀好手貼文超過200則人氣指數超過10000點
[ 貼文 449 | 人氣 17326 | 評價 2270 | 評價/貼文 5.06 | 送出評價 89 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人shin0202shin註記此篇回應為最佳解答 2007/8/15 下午 05:47:11
有看過氣象新聞裡的等高線圖吧?
你的 code 裡的 機率 * 255 的目的, 就只是要將原圖重新整理,
改用另一種角度來顯示而已 (即依照每個灰度值出現的機率來做顯示).
所以顯示出來的結果會像是等高線圖 --> 相同顏色的點代表出現的機率是一樣的.
(註: 等高線圖只是拿來讓你了解用的, 你的程式出來的結果, 相同機率的點不見得會連在一起成為等高線.)

多做這一道動作, 應該只是為了肉眼的觀察與比較而已,
個人是覺得, 這樣做沒什麼特別的意義, 因為原本圖片的灰度值就已經呈現了相同的意思
--> 相同顏色的點代表其出現的機率是一樣的.

又, 因為你的程式會將圖檔做色彩的轉換 (以R平面的灰度值來取代 G及B 平面),
所以出來的結果會較方便觀看.
作者 : shin0202shin(信)
[ 貼文 18 | 人氣 7496 | 評價 0 | 評價/貼文 0 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/8/17 上午 01:16:05
感謝大大提供的意見
我已經懂了
謝謝
作者 : yenhuang(yenhuang)
[ 貼文 4 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/10/19 下午 03:29:01
累加是為了讓直方圖等化形成一個線性的轉換
將累加的結果乘上255的原因是
將過度集中的的灰階值均勻拉開
出來的結果就是經過轉換的灰階值
作者 : yenhuang(yenhuang)
[ 貼文 4 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/10/19 下午 03:29:13
累加是為了讓直方圖等化形成一個線性的轉換
將累加的結果乘上255的原因是
將過度集中的的灰階值均勻拉開
出來的結果就是經過轉換的灰階值
作者 : yenhuang(yenhuang)
[ 貼文 4 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/10/19 下午 03:39:22
累加是為了讓直方圖等化形成一個線性的轉換
將累加的結果乘上255的原因是
將過度集中的的灰階值均勻拉開
出來的結果就是經過轉換的灰階值
 板主 : 徵求中
 > 影像處理與計算機圖學 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - 影像處理與計算機圖學 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
影像處理與計算機圖學
1 Linkin 780 
2 CrazyStar 400 
3 青衫 360 
4 白老鼠(Gary) 330 
5 悠悠深藍 220 
6 none 220 
7 shou 200 
8 ultra 200 
9 ghost 140 
10 ozzy 130 
影像處理與計算機圖學
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.046875