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

本篇博文来自博主Imageshop,打赏或想要查阅更多内容可以移步至Imageshop。

转载自:https://www.cnblogs.com/Imageshop/p/3173090.html     侵删

    接着上一篇文章的热度,继续讲讲一些稍微简单的算法吧。

      本文来讲讲碎片算法,先贴几个效果图吧:

                

      这是个破坏性的滤镜,拿美女来说事是因为搞图像的人90%是男人,色色的男人。

      关于碎片滤镜的原理,网络上可找到的资料为:将图像创建四个相互偏移的副本,产生类似重影的效果。

      就凭上述一句话,我们就可以动手了。

      分析:通过上述几幅图像的比较,特别是眼睛部位,可以看出处理的图应该看得出像是单眼变成了4个眼睛,因此,网络上的说法可靠。

      那么偏移的中心在哪里,偏移的数量又是多少呢,4个偏移,分别是往那些方向偏移呢,这些问题也很简单,可以那PS做验证:

      具体步骤如下:打开一幅图像,在图像颜色比较单调的地方(比如上述美女的手臂处)填充一处2*2像素的红色,然后复制图层,对复制后的图层进行碎片滤镜处理,并调整图层透明度为50%,局部放大可得到如下图像:

                                                    

       如此效果,则可轻易得出结论:

       偏移的中心就是以每个像素为中心,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 < Height; Y++)
        {
            Speed = Y * Stride;
            for (X = 0; X < Width; X++)
            {
                SumB = 0; SumG = 0; SumR = 0;
                for (Z = 0; Z < 4; Z++)                                           //  累积取样点的取样和
                {
                    XX = X + OffsetX[Z];
                    YY = Y + OffsetY[Z];
                    if (XX < 0)                                                    //   注意越界
                        XX = 0;
                    else if (XX >= Width)
                        XX = Width - 1;
                    if (YY < 0)
                        YY = 0;
                    else 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 < 0)
    XX = XX + Width;
while (YY >= Height)
    YY = YY - Height;
while (YY < 0)
    YY = YY + Height;

复制代码

 (3) 只计算在图像范围内的像素: 

 if (XX >= 0 && XX < Width && YY >= 0 && YY < Height)
 {
       // 累加计算
 }

      当然这样做,就必须用一个变量记录下都做了多少次符合条件的计算。

      有兴趣的朋友可以自己改改代码试一试。

      上述代码段中DataP[Speed] = (byte)((SumB+2) >> 2);要对SumB加2的原因是为了让结果进行四舍五入的操作,这样才较为合理。    

      经过测试,上述代码和PS处理的效果100%的吻合。说明我们的猜测是完全正确的。  

      还可以对算法进一步扩展:  想的远一点,为什么非的是4个重影呢,非得是45度角度呢,非得是4个像素的水平和垂直偏移呢。我给出下图让有兴趣的读者自己研发吧。

     

     图中,角度为32度,半径为10,碎片数为7,可产生类似下面的效果(可用我的Imageshop进行验证):

            

完整工程下载地址:http://files.cnblogs.com/Imageshop/Fragement.rar
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Crimm Imageshop数码图片处理系统是一款无需安装,完全绿色的单EXE图像处理软件,大小仅900多KB,启动迅速,功能丰富实用,执行速度很快。软件的界面简朴、清新,高度模仿PS CS5,各功能一目了然,菜单和快捷键按照PS做相同的设置,科学合理。 Crimm Imageshop数码图片处理系统功能上融合了常用图像处理技术的多个方面,能满足普通和专业用户在日常生活中调整图像的基本需求,对于熟悉PS的用户在使用上更是得心应手。 Crimm Imageshop数码图片处理系统软件设有很多国内图像软件都没有专业的选区功能,对所作选区可以进行羽、平滑、收缩等操作,满足高端用户的需求。为方便用户日常的工作,将常用的图像调节功能设计为一个主菜单,并通过极度的优提高了各功能的实时调节性能,满足数码级相片处理的需求。   滤镜方面,配置多达近100多个算法,既有传统的PS的部分类似特效,也有一些独创的艺术性滤镜,通过不同的组合,可以创造出令人意想不到的效果。大部分滤镜的执行速度都已优。   软件配置了专业的图像导航器、直方图、信息栏、颜色栏等面板,方便用户修改和查看图像。   在图像格式支持上,能支持多达25种图像的解析,其中不乏很多很专业格式的图像。自行完美解析BMP格式,支持一些GDI和GDI 都无法打开的BMP文件。在保存为16位图像时,增加了PS未提供的抖动选项,让用户在真彩色和高彩色之间的转换信息损失降低到最少。能完美支持各种格式的PCX\TGA\PNM等格式的转换。   软件中各滤镜的执行速度经作者极度优,和同类软件相比,往往有过之而无不及,让使用者在调节参数时能实时看到效果。   软件还多特殊的功能,如查看数码图像EXIF信息,统计图像使用的不同颜色数,这些功能无论是对于图像爱好者还是图像编程者都有一定的助。   1)熟悉PS但不需要PS的复杂功能,仅用Photoshop做些图像的简单修饰处理。   2)数码摄影图像的后期修饰使用者。   3)日常生活中的图像处理和格式转换等使用者。   4)数字图像处理理论研究者。   5)经常在不同电脑处理图像者。   当然,软件还有不少不完美的地方,我会不断的改进的,希望大家喜欢这款软件。 Crimm Imageshop数码图片处理系统 v2.2更新: 2.2版本修正了2.1版本存在的一些BUG,对常用的调节菜单中各功能的速度及调节时的实时性做了很大的改进,增加了曝光度、水平垂直边缘检测、彩色半掉等功能。
一直以来,很难找到一款体积小,能绿色执行,又功能丰富的图像处理软件,Imageshop 2.0的发布就是为了解决这个问题而存在的。 Imageshop2.0仍为单EXE文件,大小只有800多KB,对于目前任何移动设备来说这个大小都是小菜一碟。功能融合了常用图像处理各多个方面,能满足普通和专业用户在日常生活中调整图像的基本需求,对于熟悉PS的用户使用上更是得心应手。 在程序的界面上,完全模仿PS CS5,支持多图像处理,菜单和很多快捷键也按照PS做相同的设置。 在图像格式支持上,Imageshop2.0在很多方面都做到了第一。1:完备的BMP图像支持能力,能全面支持1到32位BMP的处理,并且能在尽量减少视觉损失的情况下,在各种位深之间进行转换,特别是16位图像,增加了连PS都不支持的抖动选项,能解决用户在将真彩色图像转换为高彩色时的失真问题。2、能支持多达25种图像的解析,其中不乏很多很专业的图像。3、在保存图像时支持多种该格式可用的选项,而不是像很多其他类软件草草了事。   程序设有很多国内图像软件都没有专业的选区功能,对所作选区可以进行羽、平滑、收缩等操作,满足高端用户的需求。 在图像调节上,Imageshop2.0在第一版的基础上做了大量的改进和增添,在用户体验上也进行了改进,是用户更改图像更为方便快捷有效。 滤镜方面,更是有了较大的变动,一是大幅提高了原有部分滤镜的执行速度,同时增加更多有创意的滤镜。 同时,软件还增添了很多新功能,这些功能无论是对于图像爱好者还是图像编程者都有一定的帮助。 当然,程序还有不完美的地方,我会不断的改进的,希望大家喜欢这款软件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值