JS技术

图像滤镜艺术---保留细节的磨皮之C#程序实现 - Trent1985的专栏 - 博客频道 - CSDN.NET Tre

字号+ 作者:H5之家 来源:H5之家 2015-12-14 18:05 我要评论( )

[I,map]=imread(img1.bmp); %读入图像imshow(I,map); %显示原图像I=double(I); %转换为double类型[Gx,Gy]=gradient(I);

上一篇博文“保留细节的磨皮滤镜之PS实现”一文中,我简单介绍了本人自己总结的一种非常简单的磨皮滤镜,这个滤镜在磨光皮肤的同时,会保留很不错的细节,今天,我将介绍使用C#程序实现这个磨皮的过程。

这里,我们同样是使用ZPhotoEngine库来实现,毕竟这个库中实现的效果跟PS是几乎一模一样的,关于下载地址,文章最后会给出,废话不多说了,磨皮步骤如下:

一,对原图的副本a执行表面模糊,半径15;

二,对原图执行高反差保留,半径1.0;

三,对高反差结果与原图做线性光图层处理,50%透明度即可;

根据以上三步,我的磨皮类主要代码如下:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; using System.Drawing.Imaging; namespace TestDemo { unsafe class ImageFilter { ZPhotoEngineDll zp = new ZPhotoEngineDll(); public Bitmap SoftSkinFilter(Bitmap src, int blurRadius) { //表面模糊图层 Bitmap a = zp.SurfaceBlur(src, 28, blurRadius); //高反差图层 Bitmap highPass = zp.HighPassProcess(src, 1.0f); BitmapData srcData = a.LockBits(new Rectangle(0, 0, a.Width, a.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); BitmapData dstData = highPass.LockBits(new Rectangle(0, 0, highPass.Width, highPass.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); byte* p = (byte*)srcData.Scan0; byte* dstP = (byte*)dstData.Scan0; int offset = srcData.Stride - a.Width * 4; int temp = 0; for (int j = 0; j < a.Height; j++) { for (int i = 0; i < a.Width; i++) { ////////////////Process image... //线性光图层混合 temp = zp.ModeLinearLight(p[0], dstP[0]); //透明度50% dstP[0] = (byte)((p[0] + temp) >> 1); temp = zp.ModeLinearLight(p[1], dstP[1]); dstP[1] = (byte)((p[1] + temp) >> 1); temp = zp.ModeLinearLight(p[2], dstP[2]); dstP[2] = (byte)((p[2] + temp) >> 1); dstP += 4; p += 4; } dstP += offset; p += offset; } a.UnlockBits(srcData); highPass.UnlockBits(dstData); return highPass; } } }界面部分主要代码如下:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing.Imaging; namespace TestDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } #region 变量声明 //图像路径 private String curFileName = null; //当前图像变量 private Bitmap curBitmap = null; //原始图像变量 private Bitmap srcBitmap = null; // ImageFilter imfilter = new ImageFilter(); #endregion #region 图像打开保存模块 //打开图像函数 public void OpenFile() { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "所有图像文件 | *.bmp; *.pcx; *.png; *.jpg; *.gif;" + "*.tif; *.ico; *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf|" + "位图( *.bmp; *.jpg; *.png;...) | *.bmp; *.pcx; *.png; *.jpg; *.gif; *.tif; *.ico|" + "矢量图( *.wmf; *.eps; *.emf;...) | *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf"; ofd.ShowHelp = true; ofd.Title = "打开图像文件"; if (ofd.ShowDialog() == DialogResult.OK) { curFileName = ofd.FileName; try { curBitmap = (Bitmap)System.Drawing.Image.FromFile(curFileName); srcBitmap = new Bitmap(curBitmap); } catch (Exception exp) { MessageBox.Show(exp.Message); } } } //保存图像函数 public void SaveFile() { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "PNG文件(*.png)|*.png"; if (sfd.ShowDialog() == DialogResult.OK) { pictureBox1.Image.Save(sfd.FileName, ImageFormat.Png); } } //打开图像 private void openBtn_Click(object sender, EventArgs e) { OpenFile(); if (curBitmap != null) { pictureBox1.Image = (Image)curBitmap; } } //保存图像 private void saveBtn_Click(object sender, EventArgs e) { if (pictureBox1.Image != null) SaveFile(); } #endregion //确定 private void okBtn_Click(object sender, EventArgs e) { if (pictureBox1.Image != null) { int radius = Convert.ToInt32(textBox1.Text.ToString()); if (radius >= 0 && radius <= 20) { pictureBox1.Image = (Image)imfilter.SoftSkinFilter(curBitmap, radius); } } } } } 程序界面如下:


最后,放上效果图:


原图                                                                                  C#程序效果图

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 图像处理中的数学原理详解19——函数的极限 - 白马负金羁的专栏 - 博客频道 - CSDN.NET 白马负金羁的专栏

    图像处理中的数学原理详解19——函数的极限 - 白马负金羁的专栏 - 博

    2015-12-14 19:00

  • Photo Editing Extension 详解 (附带应用滤镜Demo) - Colin丶 - 博客频道 - CS

    Photo Editing Extension 详解 (附带应用滤镜Demo) - Colin丶 - 博客

    2015-12-14 16:09

  • 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析 - 【C++游戏编程】微软最有价值专家—毛星云(浅

    【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析 -

    2015-12-13 10:14

网友点评
<