搜尋
首頁web前端PS教程PhotoShop演算法原理解析系列 - 像素化-碎片

      接著上一篇文章的熱度,繼續講一些稍微簡單的演算法。

      本文來講講碎片演算法,先貼幾個效果圖:

     PhotoShop算法原理解析系列 - 像素化-碎片  PhotoShop算法原理解析系列 - 像素化-碎片    PhotoShop算法原理解析系列 - 像素化-碎片     PhotoShop算法原理解析系列 - 像素化-碎片

* *

      這是個破壞性的濾鏡,拿美女來說事是因為搞影像的人90%是男人,色色的男人。

      關於碎片濾鏡的原理,網路上可找到的資料為:將影像建立四個相互偏移的副本,產生類似重影的效果。

      就憑上述一句話,我們就可以動手了。

      分析:透過上述幾個影像的比較,特別是眼睛部位,可以看出處理的圖應該看得出像是單眼變成了4個眼睛,因此,網絡上的說法可靠。

      那麼偏移的中心在哪裡,偏移的數量又是多少呢,4個偏移,分別是往那些方向偏移呢,這些問題也很簡單,可以那PS做驗證:

      具體步驟如下:打開一幅影像,在影像顏色較單調的地方(例如上述美女的手臂處)填滿一處2*2像素的紅色,接著複製圖層,將複製後的圖層進行碎片濾鏡處理,並調整圖層透明度為50%,局部放大可取得下列影像:

                 &*PhotoShop算法原理解析系列 - 像素化-碎片

     

 如此效果,則可輕易得出結論:

       偏移的中心就是以每個像素為中心,4個偏移分別以中心對稱,斜45度均勻圓週佈置,水平和垂直偏移各45度,偏移量4個像素。

       那麼如何疊加的問題應該可以猜測,是取四次偏移後累積值的平均值。

       針對如此思路,我寫出如下算法:

private void CmdFragment_Click(object sender, EventArgs e)
{    int X, Y, Z, XX, YY;    int Width, Height, Stride;    int Speed, Index;    int SumR, SumG, SumB;
    Bitmap Bmp = (Bitmap)Pic.Image;    if (Bmp.PixelFormat != PixelFormat.Format24bppRgb) throw new Exception("不支持的图像格式.");

    Width = Bmp.Width; Height = Bmp.Height; Stride = (int)((Bmp.Width * 3 + 3) & 0XFFFFFFFC);    byte[] ImageData = new byte[Stride * Height];                                    // 用于保存图像数据,(处理前后的都为他)
    byte[] ImageDataC = new byte[Stride * Height];                                   // 用于保存克隆的图像数据
    int[] OffsetX = new int[] { 4, -4, -4, 4 };                                      // 每个点的偏移量
    int[] OffsetY = new int[] { -4, -4, 4, 4 };    fixed (byte* P = &ImageData[0], CP = &ImageDataC[0])
    {        byte* DataP = P, DataCP = CP;
        BitmapData BmpData = new BitmapData();
        BmpData.Scan0 = (IntPtr)DataP;                                              //  设置为字节数组的的第一个元素在内存中的地址
        BmpData.Stride = Stride;
        Bmp.LockBits(new Rectangle(0, 0, Bmp.Width, Bmp.Height), ImageLockMode.ReadWrite | ImageLockMode.UserInputBuffer, PixelFormat.Format24bppRgb, BmpData);

        Stopwatch Sw = new Stopwatch();                                             //  只获取计算用时        Sw.Start();
        System.Buffer.BlockCopy(ImageData, 0, ImageDataC, 0, Stride * Height);     //  填充克隆数据        

        for (Y = 0; Y = Width)
                        XX = Width - 1;                    if (YY = Height)
                        YY = Height - 1;
                    Index = YY * Stride + XX * 3;
                    SumB += DataCP[Index];
                    SumG += DataCP[Index + 1];
                    SumR += DataCP[Index + 2];
                }

                DataP[Speed] = (byte)((SumB+2) >> 2);    //  求平均值(Sum+2)/4,为什么要+2,就为了四舍五入。比如如果计算结果为108.6,则取像素109更为合理     
                DataP[Speed + 1] = (byte)((SumG + 2) >> 2);
                DataP[Speed + 2] = (byte)((SumR + 2) >> 2);
                Speed += 3;                                                     //  跳往下一个像素            }
        }
        Sw.Stop();        this.Text = "计算用时: " + Sw.ElapsedMilliseconds.ToString() + " ms";
        Bmp.UnlockBits(BmpData);                         //  必须先解锁,否则Invalidate失败     }
    Pic.Invalidate();}

 

 演算法中, OffsetX 和 OffsetY分別為取樣點像素的偏移量。同樣,由於該濾鏡涉及了領域操作,在處理前需要做像素備份,但這裡沒有對備份資料進行擴展。因此,在內部程式碼裡就需要對取樣點的座標進行驗證,看是否超過其範圍,如果超過範圍,通常在影像濾鏡演算法範圍內,有3種處理方式:

(1)超過了則認為是其最接近的邊界值,即重複邊緣像素,這部分代碼即上述貼出的if ..... else if 部分。

(2)折回,可用以下程式碼來描述:

while (XX >= Width)
    XX = XX - Width;while (XX = Height)
    YY = YY - Height;while (YY <p></p><p> (3 ) 只計算在影像範圍內的像素: <span style="font-size: 13px;"></span></p><p class="cnblogs_code"></p><pre class="brush:php;toolbar:false"> if (XX >= 0 && XX = 0 && YY <p></p>      <p>當然這樣做,就必須用一個變數記錄下都做了多少次符合條件的計算。 <span style="font-size: 13px;"></span></p><p>      有興趣的朋友可以自己改改程式碼試試看。 <span style="font-size: 13px;"></span></p><p><span style="font-size: 13px;">      上述程式碼段中DataP[Speed] = (byte)((SumB+2) >> 2);要對SumB加2的原因是為了讓結果進行四捨五入的操作,這樣才較為合理。    </span></p><p><span style="font-size: 13px;">      經過測試,上述程式碼和PS處理的效果100%的吻合。說明我們的猜測是完全正確的。 </span></p><p><span style="font-size: 13px;">      還能進一步延伸演算法:  </span><span style="font-size: 13px;">想的遠一點,為什麼非的是4個重影呢,非得是45度角度呢,非得是4個像素的水平和垂直偏移呢。我給下圖讓有興趣的讀者自己研發吧。 </span></p><p><span style="font-size: 13px;">     <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/013/1ec01116c8ef6115593d57c273276c69-5.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="PhotoShop算法原理解析系列 - 像素化-碎片"    style="max-width:90%"  style="max-width:90%" title="PhotoShop算法原理解析系列 - 像素化-碎片"></span></p><p><span style="font-size: 13px;">     圖中,角度為32度,半徑為10,碎片數為7,可產生類似下方的效果(可用我的Imageshop進行驗證):</span></p><p><span style="font-size: 13px;">     <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/013/1ec01116c8ef6115593d57c273276c69-6.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="PhotoShop算法原理解析系列 - 像素化-碎片"    style="max-width:90%"  style="max-width:90%" title="PhotoShop算法原理解析系列 - 像素化-碎片">       <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/013/1ec01116c8ef6115593d57c273276c69-7.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="PhotoShop算法原理解析系列 - 像素化-碎片"    style="max-width:90%"  style="max-width:90%" title="PhotoShop算法原理解析系列 - 像素化-碎片"></span></p><p> 更多PhotoShop演算法原理解析系列- 像素化-碎片相關文章請關注PHP中文網! </p>
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
攝影師的Photoshop:增強和修飾圖像攝影師的Photoshop:增強和修飾圖像Apr 25, 2025 am 12:01 AM

在Photoshop中增強和修飾照片可以通過調整亮度和對比度、使用修復畫筆工具來實現。 1)調整亮度和對比度:通過Image->Adjustments->Brightness/Contrast菜單,增加亮度和對比度以改善曝光不足的照片。 2)使用修復畫筆工具:選擇工具欄中的HealingBrushTool,塗抹以去除圖像中的雜點或疤痕。

訪問Photoshop:方法和可用性訪問Photoshop:方法和可用性Apr 24, 2025 am 12:07 AM

可以通過購買永久許可證或訂閱CreativeCloud兩種方式獲取Photoshop。 1.購買永久許可證適合長期使用,無需每月支付,但無法享受最新更新。 2.訂閱CreativeCloud可訪問最新版本及其他Adobe軟件,需持續支付月費或年費。選擇應基於使用頻率和需求。

Photoshop最有用的是:常見任務和項目Photoshop最有用的是:常見任務和項目Apr 23, 2025 am 12:06 AM

Photoshop擅長圖像編輯、圖層和蒙版、數字繪畫及多種設計應用。 1)圖像編輯與修復:去除瑕疵,調整色彩和亮度。 2)圖層與蒙版:非破壞性編輯和創作。 3)數字繪畫與插圖:創作藝術作品。 4)實際應用:平面設計、網頁設計和數字藝術創作。

使用Photoshop:創意可能性和實際用途使用Photoshop:創意可能性和實際用途Apr 22, 2025 am 12:09 AM

Photoshop在實際應用中非常實用且具有創造性。 1)它提供基本編輯、修復和合成功能,適合初學者和專業人士。 2)高級功能如內容識別填充和圖層樣式可提升圖像效果。 3)掌握快捷鍵和優化圖層結構能提高工作效率。

Photoshop:高級技術和工具Photoshop:高級技術和工具Apr 21, 2025 am 12:08 AM

AdobePhotoshop的高級功能包括高級選擇工具、圖層混合模式和動作與腳本。 1)高級選擇工具如快速選擇工具和色彩範圍選擇工具可精確選擇圖像區域。 2)圖層混合模式如“疊加”模式能創造獨特視覺效果。 3)動作和腳本能自動化重複任務,提高工作效率。

Photoshop的主要功能:修飾和增強Photoshop的主要功能:修飾和增強Apr 20, 2025 am 12:07 AM

Photoshop在修圖和增強方面的強大功能包括:1.使用“修復畫筆工具”去除痘痘,2.使用“液化工具”瘦臉,3.使用“頻率分離”技術進行精確修圖,這些功能通過算法和圖像處理技術實現,優化圖像處理效果。

Photoshop的主要特徵:深度潛水Photoshop的主要特徵:深度潛水Apr 19, 2025 am 12:08 AM

Photoshop的關鍵功能包括圖層與蒙版、調整工具、濾鏡與效果。 1.圖層與蒙版允許獨立編輯圖像部分。 2.調整工具如亮度/對比度可修改圖像色調和亮度。 3.濾鏡與效果可快速添加視覺效果。掌握這些功能可以幫助創意專業人士實現創意願景。

Photoshop和數字藝術:繪畫,插圖和合成Photoshop和數字藝術:繪畫,插圖和合成Apr 18, 2025 am 12:01 AM

Photoshop在數字藝術中的應用包括繪畫、插圖和圖像合成。 1)繪畫:使用畫筆、鉛筆和混合工具,藝術家可創造逼真效果。 2)插圖:通過矢量和形狀工具,藝術家可精確繪製複雜圖形並添加效果。 3)合成:利用蒙版和圖層混合模式,藝術家可將不同圖像元素無縫融合。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器