频道栏目
首页 > 程序开发 > 综合编程 > 其他综合 > 正文
图像滤镜艺术---Oilpaint油画滤镜
2015-09-13 09:56:18         来源:Trent1985的专栏  
收藏   我要投稿
Oilpaint油画滤镜 图像油画效果实际上是将图像边缘产生一种朦胧,雾化的效果,同时,将一定的边缘模糊化,这样图像整体上看去像素与像素之间就像雾一样随机呈现。 算法过程如下: 假设当前像素为P(x,y),他的随机位置为Pd(dx,dy),那么算法公式如下:

\

其中,K(v)为最大值不大于v的随机数正数,v为雾化阈值,v值越大,雾化程度越明显,反之,雾化程度越小,v=0时,图像无变化效果。

核心代码如下:

///

 

/// Mosaic filter.

///

 

///Source image.

///The size of mosaic effect.

/// Resullt image.

public Bitmap OilpaintFilter(Bitmap src, int intensity)

{

Bitmap srcBitmap = new Bitmap(src);

int w = srcBitmap.Width;

int h = srcBitmap.Height;

System.Drawing.Imaging.BitmapData srcData = srcBitmap.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

IntPtr ptr = srcData.Scan0;

int bytes = h * srcData.Stride;

byte[] srcValues = new byte[bytes];

System.Runtime.InteropServices.Marshal.Copy(ptr, srcValues, 0, bytes);

byte[] tempValues = (byte[])srcValues.Clone();

int stride = srcData.Stride;

Random ran = new Random();

int k = 0;

int dx = 0;

int dy = 0;

for (int j = 0; j < h; j++)

{

for (int i = 0; i < w; i++)

{

k = ran.Next(intensity);

dx = (i + k) >= w ? w - 1 : (i + k);

dy = (j + k) >= h ? h - 1 : (j + k);

tempValues[i * 4 + j * w * 4] = (byte)srcValues[dx * 4 + dy * w * 4];

tempValues[i * 4 + 1 + j * w * 4] = (byte)srcValues[dx * 4 + 1 + dy * w * 4];

tempValues[i * 4 + 2 + j * w * 4] = (byte)srcValues[dx * 4 + 2 + dy * w * 4];

}

}

srcValues = (byte[])tempValues.Clone();

System.Runtime.InteropServices.Marshal.Copy(srcValues, 0, ptr, bytes);

srcBitmap.UnlockBits(srcData);

return srcBitmap;

}

图像油画滤镜效果如下:

\

原图

\

 

点击复制链接 与好友分享!回本站首页
上一篇:通过gdb快速定位“段错误”的位置
下一篇:数据结构实践——循环双链表应用
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站