none
c# 二值化問題 RRS feed

  • 問題

  • 各位大大好

    在這想要請問一下 我要做一個關於照片做二值化區塊處理

    以下是我做處理的程式碼

     

    int stride = bmData.Stride;
                        System.IntPtr Scan0 = bmData.Scan0;
                        byte* p = (byte*)(void*)Scan0;
                        int nOffset = stride - m_Bitmap.Width * 3;
    
                        int nWidth = m_Bitmap.Width/10;
                        int nHeight = m_Bitmap.Height/10;
    
    
                        for (int y = 0; y <nWidth;  ++y)
                        {
                            for (int x = 0; x <nHeight; ++x)
                            {
                                if (p[0] > va)
                                {
                                    p[0] = p[1] = p[2] = 255;
                                }
                                else
                                {
                                    p[0] = p[1] = p[2] = 0;
                                }
                                tt = p[0];
                                gray[tt]++;
                                p += 3;
    
                            }
    
                            // p += nOffset;
    
                        }
    
                    }
                    m_Bitmap.UnlockBits(bmData);
                    //flag = 1;
                  //  graydo2();
                    panel1.Invalidate();

    圖原本是640*480

    但在

    int nWidth = m_Bitmap.Width/10;

     int nHeight = m_Bitmap.Height/10;

    將區域設定為 64*48

    圖片的二值化卻變成下圖的樣子

    照理說應該是上圖紅框的樣子才對

    請問是我有哪個地方寫錯了嗎??

    2011年10月5日 上午 11:10

所有回覆

  • Bitmap 是橫向掃描的格式。

    你的陣列索引值計算的有問題。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年10月5日 下午 12:53
  • 那請問一下要如何做區塊二值化?

    我應該要怎麼改呢??

     int tt;

                if (m_Bitmap != null)

                {

                    int Mr = 0;//灰度均值

                    long sum = 0;

                    int count = 0;

                    for (int i = 0; i < 256; i++)

                    {

                        sum += gray[i] * i;

                        count += gray[i];

                    }

                    Mr = (int)(sum / count);

                    int sum1 = 0;

                    int count1 = 0;

                    for (int i = 0; i <= Mr; i++)

                    {

                        sum1 += gray[i] * i;

                        count1 += gray[i];

                    }

                    int g1 = sum1 / count1;

     

                    int sum2 = 0;

                    int count2 = 0;

                    for (int i = Mr; i <= 255; i++)

                    {

                        sum2 += gray[i] * i;

                        count2 += gray[i];

                    }

                    int g2 = sum2 / count2;

     

                    //求閥值

                    int va;

                    if (count1 < count2)

                    {//白底黑字

                        va = Mr - count1 / count2 * Math.Abs(g1 - Mr);

                    }

                    else                //黑底白字

                        va = Mr + count2 / count1 * Math.Abs(g2 - Mr);

                    BitmapData bmData = m_Bitmap.LockBits(new Rectangle(0, 0, m_Bitmap.Width, m_Bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

     

     

     

    您說的陣列是這裡嗎??

     

    2011年10月5日 下午 01:08
  • 你再貼的原始碼我沒看。我說的是:

     p += 3;


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年10月5日 下午 02:48
  • 你的gray 陣列的值是多少?

    不過重點 還是在你的迴圈

                    int nWidth = m_Bitmap.Width / 10;
                    int nHeight = m_Bitmap.Height / 10;
                    BitmapData bmData = m_Bitmap.LockBits(new Rectangle(0, 0, nWidth, nHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                    int ByteOfSkip = bmData.Stride - nWidth * 3;
                    System.IntPtr Scan0 = bmData.Scan0;
                    byte* p = (byte*)(void*)Scan0;
                    for (int y = 0; y < nHeight; ++y)
                    {
                        for (int x = 0; x < nWidth; ++x)
                        {
                            if (p[0] > va)
                            {
                                p[0] = p[1] = p[2] = 255;
                            }
                            else
                            {
                                p[0] = p[1] = p[2] = 0;
                            }
                            p += 3;
                        }
                        p += ByteOfSkip;
                    }
                    m_Bitmap.UnlockBits(bmData);
    

     

     


    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

     

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

     

    在標題或文章註明很急
    不會增加網友回覆速度
    • 已編輯 Alex_Lee 2011年10月5日 下午 04:38
    2011年10月5日 下午 03:24
  • ㄚ奇:

    你這篇討論後續狀況如何了 ?


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 ㄚ奇 2011年10月24日 上午 11:40
    • 已取消標示為解答 ㄚ奇 2011年10月24日 上午 11:40
    2011年10月16日 上午 08:36
    版主
  • 真抱歉

    我沒有找到方法解決

    但這不是非常嚴重的問題

    日前都在處理提報的事情又有新的事件要處理

    就沒有理會這塊部分了

    目前只能用上述方法做完整個圖的二值化

    還是停留在第一篇的問題上= =

    2011年10月24日 上午 11:42
  • 因為你沒改你陣列的索引值。

    你不妨把你認為 1, 2 的點標記為紅色,然後放大來看,看看哪裡被標記為紅色,你就會知道你的索引值哪裡算錯。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年10月24日 下午 01:10