直方圖均衡化算法 & 代碼


做了一天,都是黑屏,最后發現,竟然是一個局部變量引起。

   基本是分3步,這個是在灰度圖像下 實現均衡化直方圖。 彩色下直接均衡化研究出來再補上。

第一步:

  計算初始直方圖,即記錄每一個像素出現次數。

for(int y = 0; y < m_image->GetHeight(); y++)
{
    for(int x = 0; x < m_image->GetWidth();x++)
    {
        COLORREF rgb = m_image->GetPixel(x,y);
int rValue = GetRValue(rgb); // 記錄每一個像素出現次數。 hist[rValue]++; } }

第二步:

   由上面得到的初始直方圖計算歸一化直方圖和累積直方圖

int hist[256] = {0};

double phist[256];

for (int i = 0; i <= 255 ;i++)
{
    phist [i] = (double) hist[i] / (m_image->GetHeight() * m_image->GetWidth());  //歸一化直方圖 即每個像素出現概率
}
double dSum[256] = {0.0};

for(int i = 0; i<=255;i++)
{
    if(i != 0)
    {
        dSum[i] = dSum[i-1] + phist[i];
    }
    else//累積直方圖
    {
        dSum[i]  = phist[i];
    }
}

第三步:

  求均衡化映射(舊圖->新圖)關系,並寫入新圖像

for(int y = 0; y < m_image->GetHeight(); y++)
{
    for(int x = 0; x < m_image->GetWidth();x++)
    {
        COLORREF rgb = m_image->GetPixel(x,y);

        int rValue = GetRValue(rgb);

        rValue = Mapping[rValue];        //根據映射關系實現均衡化
        rgb = RGB(rValue,rValue,rValue);
        m_image->SetPixel(x,y,rgb);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM