PS色調均化濾鏡的快捷實現(C#源代碼)。


  photoshop色調均化功能通常是在進行修片處理前期比較常用的功能之一,其對擴展圖像的對比度,增強視覺效果有一定的作用。在很多課本或者文章中,也稱這種處理為灰度均衡化、直方圖均衡化等等。算法原理都是對原始圖像統計其直方圖,然后通過累計分布函數,重新隱射直方圖數據,使每個色階的的分布概率都往一致的方向調整。我看到的網絡上的代碼,抑或是一些教材中的代碼,對這個過程的描述都是相當的冗余,要么是代碼累贅,效率低下,要么是蘿莉啰唆,很是難受。

   在給出我的代碼之前,還需要說明一些問題。對於灰度圖像,由於只有一個通道,這個問題不明顯,對於常見的24位圖像,由於有RGB三個通道,那就存在是每個通道都單獨均衡還是三通道聯合計算直方圖,然后利用相同的映射表在隱射RGB數據了,經過我的測試,在Photoshop中,是取的后者。

    for (Y = 0; Y < Height; Y++) { Pointer = Scan0 + Y * Stride;               // 定位到每個掃描行的第一個像素,以避免溶於數據的影響
        for (X = 0; X < Width; X++) { HistGram[*Pointer]++;                   // Blue
            HistGram[*(Pointer + 1)]++;             // Green
            HistGram[*(Pointer + 2)]++;             // Red 
            Pointer += 3;                           // 移向下一個像素
 } } Num = 0; for (Y = 0; Y < 256; Y++) { Num = Num + HistGram[Y]; Lut[Y] = (byte)((float)Num / (Width * Height * 3) * 255);       // 計算映射表
 } for (Y = 0; Y < Height; Y++) { Pointer = Scan0 + Y * Stride; for (X = 0; X < Width * 3; X += 3)          // 也可以這樣寫
 { Pointer[X] = Lut[Pointer[X]]; Pointer[X + 1] = Lut[Pointer[X + 1]]; Pointer[X + 2] = Lut[Pointer[X + 2]]; } }

  算法部分就是這么簡單的二十幾行代碼,代碼清晰,執行效率又特別高,數碼相機中常見的4000*3000的照片100ms內就可以處理完。

    一副圖像如果執行了一次色調均化,那么再次執行色調均化應該不會有任何像素發生變換了。

    從廣義上講,色調均化可以看成是直方圖匹配的一個特例,即匹配的直方圖分布為一條水平線。

    一些書中的色調均化是對各通道分別進行校正的,似乎這樣處理的效果容易導致圖像整體顏色不搭配,比如經典的Lena圖:

             

                      原圖                               PS的色調均化                               郎銳課本上的效果

   C#版色調均化代碼:http://files.cnblogs.com/Imageshop/HistGramEqualize.rar

 


免責聲明!

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



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