原文链接:https://blog.csdn.net/wchstrife/article/details/78984735

使用C#进行图像处理
前言
之前一直认为图像处理是一件很高大上的事情,在一门选修课的课上遇到一个图像处理的作业,上手几个简单的图像处理的算法,也算是入了个最简单的门。
界面简单而又丑陋,代码命名也比较随意,大家重点关注算法就好
在这里一共实现了暗角、降低亮度、灰度、浮雕、马赛克、扩散六个算法。
项目github地址:https://github.com/wchstrife/ImageProcessing

界面设计
这里使用的是VS2010,新建C#工程之后。在界面上画出
- 2个pictureBox作为显示的图片的控件。
- 6个button作为不同效果的触发器,
- 2个button作为文件打开和保存的触发器,
- 1个label负责展示运行时间。

文件打开与保存
这里主要就是调用了openFileDialog和openFileDialog,不具体说。
打开文件:

 private void btnopen_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
string path = openFileDialog1.FileName;
bitmap = (Bitmap)Image.FromFile(path);
pbimage.Image = bitmap.Clone() as Image;
}
}

保存文件:

     private void btnsave_Click(object sender, EventArgs e)
{
sw1.Reset();
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{ sw1.Start();
string filename = saveFileDialog1.FileName.ToString();
if (filename.Length > )
{
string fileextname = filename.Substring(filename.IndexOf('.') + ).ToString();
ImageFormat imagefomart = null;
if (fileextname.Length > )
{
switch (fileextname.ToLower())
{
case "jpg": imagefomart = ImageFormat.Jpeg; break;
case "jpeg": imagefomart = ImageFormat.Jpeg; break;
case "bmp": imagefomart = ImageFormat.Bmp; break;
case "gif": imagefomart = ImageFormat.Gif; break;
default:; break;
}
}
if(imagefomart==null)
{
imagefomart = ImageFormat.Jpeg;
}
try
{
this.pbnewimage.Image.Save(filename, imagefomart);
sw1.Stop();
label1.Text = "时间:" + sw1.ElapsedMilliseconds;
}
catch (Exception ex)
{ throw ex;
} }
}
}

添加暗角
暗角就是在图像的四角添加逐渐变黑的一个圈。

基本步骤:
计算顶点与中心的距离maxDistance
计算每个像素点与中心的距离distance
计算factor = distance / maxDistance
将当前像素点的颜色设置为 原颜色 * (1-factor)
效果图

实现算法:

    private void btndark_Click(object sender, EventArgs e)
{
newbitmap = bitmap.Clone() as Bitmap;
sw1.Reset();
sw1.Start();
int width = newbitmap.Width;
int height = newbitmap.Height;
float cx = width / ;
float cy = height / ;
float maxdist = cx * cx + cy * cy;
float currdist = , factor;
Color pixel;
for (int i = ; i < width; i++)
{
for (int j = ; j < height; j++)
{
currdist = ((float)i - cx) * ((float)i - cx) + ((float)j - cy) + ((float)j - cy);
factor = currdist / maxdist;
pixel = newbitmap.GetPixel(i,j);
int red = (int)(pixel.R * ( - factor));
int green = (int)(pixel.G * ( - factor));
int blue = (int)(pixel.R * ( - factor));
newbitmap.SetPixel(i, j, Color.FromArgb(red, green, blue));
}
}
sw1.Stop();
label1.Text = sw1.ElapsedMilliseconds.ToString();
pbnewimage.Image = newbitmap.Clone() as Image;
}

降低亮度
基本步骤
降低亮度就是设置当前像素的颜色为原来的一个小于1的系数,要注意各颜色的分量不能超过255。这里我们选取0.6作为系数。

效果图

实现代码

   private void btnvright_Click(object sender, EventArgs e)
{
if (bitmap != null)
{
newbitmap = bitmap.Clone() as Bitmap;
sw1.Reset();
sw1.Restart();
Color pixel;
int red, green, blue;
for (int x = ; x < newbitmap.Width; x++)
{
for (int y = ; y < newbitmap.Height; y++)
{
pixel = newbitmap.GetPixel(x, y);
red = (int)(pixel.R * 0.6);
green = (int)(pixel.G * 0.6);
blue = (int)(pixel.B * 0.6);
newbitmap.SetPixel(x, y, Color.FromArgb(red, green, blue));
}
}
sw1.Stop();
label1.Text = sw1.ElapsedMilliseconds.ToString();
pbnewimage.Image = newbitmap.Clone() as Image;
}
}

去色
基本步骤
去色也就是要把照片灰化,将照片的RGB调节为灰色的。
具体的就是要把当前像素点的颜色按下面的公式的调整
gary = 0.3 * R + 0.59 * G + 0.11 * B

效果图

实现算法

 private void btndecolor_Click(object sender, EventArgs e)
{
if (bitmap != null)
{
newbitmap = bitmap.Clone() as Bitmap;
sw1.Reset();
sw1.Restart();
Color pixel;
int gray;
for (int x = ; x < newbitmap.Width; x++)
{
for (int y = ; y < newbitmap.Height; y++)
{
pixel = newbitmap.GetPixel(x, y);
gray = (int)(0.3 * pixel.R + 0.59 * pixel.G + 0.11 * pixel.B);
newbitmap.SetPixel(x, y, Color.FromArgb(gray, gray, gray));
}
}
sw1.Stop();
label1.Text = sw1.ElapsedMilliseconds.ToString();
pbnewimage.Image = newbitmap.Clone() as Image;
}
}

浮雕
基本步骤
浮雕效果就是把RGB三个颜色取反。
具体的实现用255-当前颜色的分量

效果图

### 实现算法

     private void btnrelief_Click(object sender, EventArgs e)
{
if (bitmap != null)
{
newbitmap = bitmap.Clone() as Bitmap;
sw1.Reset();
sw1.Restart();
Color pixel;
int red, green, blue;
for (int x = ; x < newbitmap.Width; x++)
{
for (int y = ; y < newbitmap.Height; y++)
{
pixel = newbitmap.GetPixel(x, y);
red = (int)( - pixel.R);
green = (int)( - pixel.G);
blue = (int)( - pixel.B);
newbitmap.SetPixel(x, y, Color.FromArgb(red, green, blue));
}
}
sw1.Stop();
label1.Text = sw1.ElapsedMilliseconds.ToString();
pbnewimage.Image = newbitmap.Clone() as Image;
}
}

马赛克
基本步骤
马赛克的基本思想就是把一个像素点周围的点的像素取个平均,然后把这些像素点的颜色设为这个平均值。
周围的像素点取的越多,马克赛的效果也就越明显。

效果图

实现算法

    private void btnmosaic_Click(object sender, EventArgs e)
{
if (bitmap != null)
{
newbitmap = bitmap.Clone() as Bitmap;
sw1.Reset();
sw1.Restart();
int RIDIO = ;//马赛克的尺度,默认为周围两个像素
for (int h = ; h < newbitmap.Height; h += RIDIO)
{
for (int w = ; w < newbitmap.Width; w += RIDIO)
{
int avgRed = , avgGreen = , avgBlue = ;
int count = ;
//取周围的像素
for (int x = w; (x < w + RIDIO && x < newbitmap.Width); x++)
{
for (int y = h; (y < h + RIDIO && y < newbitmap.Height); y++)
{
Color pixel = newbitmap.GetPixel(x, y);
avgRed += pixel.R;
avgGreen += pixel.G;
avgBlue += pixel.B;
count++;
}
} //取平均值
avgRed = avgRed / count;
avgBlue = avgBlue / count;
avgGreen = avgGreen / count; //设置颜色
for (int x = w; (x < w + RIDIO && x < newbitmap.Width); x++)
{
for (int y = h; (y < h + RIDIO && y < newbitmap.Height); y++)
{
Color newColor = Color.FromArgb(avgRed, avgGreen, avgBlue);
newbitmap.SetPixel(x, y, newColor);
}
}
}
}
sw1.Stop();
label1.Text = sw1.ElapsedMilliseconds.ToString();
pbnewimage.Image = newbitmap.Clone() as Image;
}
}

扩散效果
基本步骤
类似于水墨在纸上的扩散。随机挑选一个临近的像素,将其设为自身颜色。
这里一定注意要随机取周围的像素。

效果图

实现算法

  private void btnspread_Click(object sender, EventArgs e)
{
if (bitmap != null)
{
newbitmap = bitmap.Clone() as Bitmap;
sw1.Reset();
sw1.Restart();
Color pixel;
int red, green, blue;
int flag = ;
for (int x = ; x < newbitmap.Width; x++)
{
for (int y = ; y < newbitmap.Height; y++)
{
Random ran = new Random();
int RankKey = ran.Next(-, );
if (x + RankKey >= newbitmap.Width || y + RankKey >= newbitmap.Height || x + RankKey < || y + RankKey < )
{
flag = ;
continue;
} pixel = newbitmap.GetPixel(x + RankKey, y + RankKey);
red = (int)(pixel.R);
green = (int)(pixel.G);
blue = (int)(pixel.B);
newbitmap.SetPixel(x, y, Color.FromArgb(red, green, blue));
}
}
sw1.Stop();
label1.Text = sw1.ElapsedMilliseconds.ToString();
pbnewimage.Image = newbitmap.Clone() as Image;
}
}

最新文章

  1. 组合模式/composite模式/对象结构型模式
  2. spring+task配置
  3. hadoop 流streaming跑python程序
  4. 【转】websocket协议规范
  5. 从零开始学JAVA(01)-JAVA开发环境安装
  6. 万事开头难,用HTML写的第一个界面,收获颇多
  7. java算法之身份证号码验证
  8. win7启动后报丢失nscmk.dll解决解决方式
  9. Makefile条件推断 ——————————【Badboy】
  10. [心得]传统IT转互联网面试经验分享
  11. php调用webservice接口
  12. ASP.NET Core Web API 版本控制
  13. Java核心技术及面试指南 多线程部分的基本面试题总结以及答案
  14. python3 Django集成Ueditor富文本编辑器
  15. Spring Boot 构建电商基础秒杀项目 (八) 商品创建
  16. Golang并发编程优势与核心goroutine及注意细节
  17. Python通过LDAP验证、查找用户(class,logging)
  18. 20155331《网络对抗》Exp5 MSF基础应用
  19. 数据库链接 mybatis spring data jpa 两种方式
  20. npm安装和Vue运行

热门文章

  1. github 上传大文件100MB姿势
  2. C++学习笔记-C++与C语言的一些区别
  3. django中Queryset的删除问题、分页问题
  4. IIS调试
  5. nginx配置反向代理支持session
  6. Series与list
  7. 房地产大佬潘石屹推荐学Python编程,这本从0到1就够了
  8. xargs、chattr命令
  9. React 中的函数式思想
  10. jQuery可拖拽旋转的3D图片墙