映像柔光效果(SoftGlow)的原理及其實現。

來源:互聯網
上載者:User

   由於CSDN部落格和部落格園的編輯方面有不一致的地方,導致文中部分圖片錯位,為不影響瀏覽效果,建議點擊開啟連結。  

     映像柔光效果在很多商業軟體中都有實現,比如美圖秀秀,光影魔術手等。其能針對原始映像產生一副新的比較平滑感覺光線比較柔和的效果,給人一種朦朧美,如下面幾幅圖所示:

          

     目前,關於該演算法的可控參數,美圖秀秀只提供了一個程度(0-100%)控制量,其演算法調節的效果和幅度都較小,光影魔術手有柔化程度和高光柔化兩個參數,其中柔化程度控制柔化的朦朧效果,高光柔化調節映像的亮度。 還有一些開源的軟體如Imagestone、paint.net、gimp也有softglow演算法,他們都提供了3個控制量:半徑、亮度、對比(銳度),其中Imagestone其實是翻譯的gimp的演算法,而GIMP和paint.net的演算法在基本原理上是一樣的,細節上有所區別而已。

     我們以paint.net的實現過程為例進行說明,在paint.net的原始碼中,GlowEffect.cs為實現該效果的檔案,我抽取其部分原始碼簡要說明下這個演算法的過程。

        public GlowEffect()  : base(StaticName, StaticImage, null, EffectDirectives.None, true)        {            this.blurEffect = new BlurEffect();            this.bcAdjustment = new BrightnessAndContrastAdjustment();            this.screenBlendOp = new UserBlendOps.ScreenBlendOp();        }

     以及程式碼片段:

   public override unsafe void Render(            EffectConfigToken parameters,             RenderArgs dstArgs,             RenderArgs srcArgs,             System.Drawing.Rectangle[] rois,             int startIndex,             int length)        {            // First we blur the source, and write the result to the destination surface            // Then we apply Brightness/Contrast with the input as the dst, and the output as the dst            // Third, we apply the Screen blend operation so that dst = dst OVER src            ThreeAmountsConfigToken token = (ThreeAmountsConfigToken)parameters;            AmountEffectConfigToken blurToken = new AmountEffectConfigToken(token.Amount1);            this.blurEffect.Render(blurToken, dstArgs, srcArgs, rois, startIndex, length);            BrightnessAndContrastAdjustmentConfigToken bcToken = new BrightnessAndContrastAdjustmentConfigToken(token.Amount2, token.Amount3);            this.bcAdjustment.Render(bcToken, dstArgs, dstArgs, rois, startIndex, length);            for (int i = startIndex; i < startIndex + length; ++i)            {                Rectangle roi = rois[i];                for (int y = roi.Top; y < roi.Bottom; ++y)                {                    ColorBgra* dstPtr = dstArgs.Surface.GetPointAddressUnchecked(roi.Left, y);                    ColorBgra* srcPtr = srcArgs.Surface.GetPointAddressUnchecked(roi.Left, y);                    screenBlendOp.Apply(dstPtr, srcPtr, dstPtr, roi.Width);                }            }        }

    由以上代碼初步得出結論:他們是以高斯模糊以及亮度對比調節兩個濾鏡為基礎,稍作混合即可。

      第一步:備份原始映像;

      第二步:對原始映像按指定的半徑進行高斯模糊;

      第三步:對模糊後的映像繼續進行亮度和對比的調整;

      第四步:用原始映像的備份資料同原始映像(經過上述二及三步驟處理後的映像)按照Photoshop的濾色(Screen)方式進行混合。

      關於濾色方式的混合演算法這裡簡單的提一下:  Blend = X + Y - X * Y / 255 ;  其中X和Y分別表示基色和混合色,Blend表示結果色。

      演算法的源碼可以參考我在上面說的幾個開源的軟體,當然這可能需要你有一定的編程基礎,畢竟那些軟體的架構都比較複雜。 

      關於演算法的執行速度可以說只取決於第二步,因為亮度對比的調節實際上是個查表的過程(PS的亮度對比指令其實要比大家想象的複雜點的,這個有機會再談,也可以參考阿發伯的博文http://blog.csdn.net/maozefa/article/details/4778934),而第四步其實也是可以用查表的方式來加速的(不過一定要用一位的方式)。高斯模糊這個老生長談的問題,在我所搜尋過的網頁中是沒有誰給出過一個完整的、完美的、執行速度和指定半徑無關的、可啟動並執行VB或VC或JAVA程式原始碼(一般都是給出參考文章介紹)。我自己有這個方面的代碼,不過我也不願意共用。真正有興趣的我推薦你去找GIMP的演算法代碼,在GIMP的整個源碼系統,至少給出了三種高斯模糊最佳化的代碼,分別位於blur-gauss.c(給出了2種:RLE及IIR最佳化代碼)以及contrast-retinex.c中(代碼特別簡潔),當然,那些代碼如果提取出來還應該進行代碼層面的整理和最佳化。Paint.net也提供了高斯模糊函數,不過其實質並不是高斯模糊,而是一種用線性分布的權重函數代替恒值權重,不過那個演算法裡面沒有浮點運算,並且還存在比Paint.net裡的代碼快很多即執行時間於半徑無關的最佳化演算法,而且該最佳化演算法比任何真正的高斯模糊最佳化演算法要快1倍多,而效果上區別不大,可作為即時性特彆強的場合的備用演算法。

    同樣,提供個編譯好的檔案給有興趣研究該演算法的朋友看看效果:

    http://files.cnblogs.com/Imageshop/SoftGlow.rar

   

 

*******基本上我不提供原始碼,但是我會盡量用文字把對應的演算法描述清楚或提供參考文檔******

******因為靠自己的努力和實踐寫出來的效果才真正是自己的東西,人一定要靠自己************

*****作者: laviewpbt   時間: 2013.6.20    聯絡QQ:33184777  轉載請保留本行資訊*******

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.