使用C#进行图像处理

前言

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

界面设计

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

文件打开与保存

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

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

保存文件:

private void button8_Click(object sender, EventArgs e){bool isSave = true;if (saveFileDialog1.ShowDialog() == DialogResult.OK){string fileName = saveFileDialog1.FileName.ToString();if (fileName != "" && fileName != null){string fileExtName = fileName.Substring(fileName.LastIndexOf(".") + 1).ToString();System.Drawing.Imaging.ImageFormat imgformat = null;if (fileExtName != ""){switch (fileExtName){case "jpg":imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;break;case "bmp":imgformat = System.Drawing.Imaging.ImageFormat.Bmp;break;case "gif":imgformat = System.Drawing.Imaging.ImageFormat.Gif;break;default:MessageBox.Show("只能存取为: jpg,bmp,gif 格式");isSave = false;break;}}//默认保存为JPG格式   if (imgformat == null){imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;}if (isSave){try{this.pictureBox2.Image.Save(fileName, imgformat);//MessageBox.Show("图片已经成功保存!");   }catch{MessageBox.Show("保存失败,你还没有截取过图片或已经清空图片!");}}}}}

添加暗角

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

基本步骤:

  1. 计算顶点与中心的距离maxDistance
  2. 计算每个像素点与中心的距离distance
  3. 计算factor = distance / maxDistance
  4. 将当前像素点的颜色设置为 原颜色 * (1-factor)

效果图

实现算法:

 private void button1_Click(object sender, EventArgs e){if (bitmap != null){newbitmap = bitmap.Clone() as Bitmap;sw.Reset();sw.Restart();int width = newbitmap.Width;int height = newbitmap.Height;float cx = width / 2;float cy = height / 2;float maxDist = cx * cx + cy * cy;float currDist = 0, factor;Color pixel; for (int i = 0; i < width; i++){for (int j = 0; 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 * (1 - factor));int green = (int)(pixel.G * (1 - factor));int blue = (int)(pixel.B * (1 - factor));newbitmap.SetPixel(i, j, Color.FromArgb(red, green, blue));}}sw.Stop();timer.Text = sw.ElapsedMilliseconds.ToString();pictureBox2.Image = newbitmap.Clone() as Image;               }}

降低亮度

基本步骤

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

效果图

实现代码

 private void button2_Click(object sender, EventArgs e){if (bitmap != null){newbitmap = bitmap.Clone() as Bitmap;sw.Reset();sw.Restart();Color pixel;              int red, green, blue;for (int x = 0; x < newbitmap.Width; x++){for (int y = 0; 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));}}sw.Stop();timer.Text = sw.ElapsedMilliseconds.ToString();pictureBox2.Image = newbitmap.Clone() as Image;}}

去色

基本步骤

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

效果图

实现算法

private void button3_Click(object sender, EventArgs e){if (bitmap != null){newbitmap = bitmap.Clone() as Bitmap;sw.Reset();sw.Restart();Color pixel;int gray;for (int x = 0; x < newbitmap.Width; x++){for (int y = 0; 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));}}sw.Stop();timer.Text = sw.ElapsedMilliseconds.ToString();pictureBox2.Image = newbitmap.Clone() as Image;}}

浮雕

基本步骤

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

效果图


### 实现算法

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

马赛克

基本步骤

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

效果图

实现算法

/*** 马赛克效果* 默认的效果为50格* */private void button5_Click(object sender, EventArgs e){if (bitmap != null){newbitmap = bitmap.Clone() as Bitmap;sw.Reset();sw.Restart();int RIDIO = 50;//马赛克的尺度,默认为周围两个像素for (int h = 0; h < newbitmap.Height; h += RIDIO){for (int w = 0; w < newbitmap.Width; w += RIDIO){int avgRed = 0, avgGreen = 0, avgBlue = 0;int count = 0;//取周围的像素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);}}}}sw.Stop();timer.Text = sw.ElapsedMilliseconds.ToString();pictureBox2.Image = newbitmap.Clone() as Image;}}

扩散效果

基本步骤

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

效果图

实现算法

private void button6_Click(object sender, EventArgs e){if (bitmap != null){newbitmap = bitmap.Clone() as Bitmap;sw.Reset();sw.Restart();Color pixel;int red, green, blue;int flag = 0;for (int x = 0; x < newbitmap.Width; x++){for (int y = 0; y < newbitmap.Height; y++){Random ran = new Random();int RankKey = ran.Next(-5, 5);if (x + RankKey >= newbitmap.Width || y + RankKey >= newbitmap.Height || x + RankKey < 0 || y + RankKey < 0){flag = 1;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));}}sw.Stop();timer.Text = sw.ElapsedMilliseconds.ToString();pictureBox2.Image = newbitmap.Clone() as Image;}}

使用C#进行图像处理相关推荐

  1. 图像处理 100 问!!

    图像处理 100 问!! 参考链接地址:https://github.com/gzr2017/ImageProcessing100Wen English is here (KuKuXia transl ...

  2. 《OpenCV3编程入门》学习笔记6 图像处理(三)形态学滤波(1):腐蚀与膨胀

    第6章 图像处理 6.3 形态学滤波(1):腐蚀与膨胀 6.3.1 形态学概述 1.数学形态学(Mathematical morphology):建立在格论和拓扑学基础上的图像分析学科,是数学形态学图 ...

  3. 《OpenCV3编程入门》学习笔记6 图像处理(二)非线性滤波:中值滤波、双边滤波

    第6章 图像处理 6.2 非线性滤波:中值滤波.双边滤波 6.2.1 非线性滤波 很多情况下,使用领域像素的非线性滤波会得到更好的效果,如在噪声是散粒噪声而不是高斯噪声,即图像偶尔会出现很大值时,高斯 ...

  4. 《OpenCV3编程入门》学习笔记6 图像处理(一)线性滤波:方框滤波、均值滤波、高斯滤波

    第6章 图像处理 6.1 线性滤波:方框滤波.均值滤波.高斯滤波 6.1.1 图像滤波与滤波器 1.图像滤波:在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制 目的: (1)抽出对象的特征作为图 ...

  5. Python,OpenCV图像处理超好用的工具包imutils

    imutils是我崇拜的大佬Adrian贡献的源码包,其中包含许多图像处理便捷的方法: 安装: pip install imutils 包含的工具类及方法列表: 图像平移方法 # 平移向右25px,向 ...

  6. Image Processing图像处理(对比俩张图像的差异并且在图上标注出来)

    图像处理是构建所有计算机视觉的基础.按照我的图像处理指南使用OpenCV库学习计算机视觉的基础知识. SSIM进阶,利用python & openCV将图片的差异性画框展示出来. 诀窍是学习如 ...

  7. 数字图像处理:边缘检测(Edge detection)

    转载自:https://zhuanlan.zhihu.com/p/59640437 觉得写得通俗易懂,要是每个人的博客都这么人性化.... 写在前面: 本文篇幅较长,用了大量图与公式帮助大家深入理解各 ...

  8. 数字图像处理:(1)图像梯度以及算子应用

    1.数学意义上的梯度 在理解图像梯度是什么的时候,我们首先要回忆一下以前学习过得梯度是什么? 见链接: https://blog.csdn.net/m0_37957160/article/detail ...

  9. 数字图像处理:图像就是函数的解读

    计算机视觉旨在从图像中提取有用的信息,这已经被证实是一个极具挑战性的任务.那么图像是什么?或者说我们把图像看作什么? 有人说图像就是一张图片,一个场景,一个矩形(rectangle),一个矩阵(mat ...

  10. 数字图像处理:blob分析、阈值分割

    1.Blob分析: 1.1.blob分析概念在计算机视觉中的Blob(Binary large object)是指图像中的具有相似颜色.纹理等特征所组成的一块连通区域,一般来说,该区域就是图像中的前景 ...

最新文章

  1. windows 7使用CAJViewer时出错显示缺少ReaderEX.dll处理
  2. fetch 跨域请求
  3. PaddleDetection 个人测评
  4. html响应式导航栏制作,用Sass制作响应式导航栏(原创)
  5. 根可达算法的根_GC垃圾回收算法
  6. 机器人学习--Robotics 4:Perception(宾夕法尼亚大学COURSERA课程)
  7. 从三大顶会论文看百变Self-Attention
  8. junit4使用心得
  9. SAP Cloud for Customer根据Accouunt自动带出Sales Unit的配置
  10. python 进程池 等待数量_【2020Python修炼记】python并发编程(六)补充—进程池和线程池...
  11. TensorFlow报错run() got multiple values for argument 'feed_dict'
  12. 3分钟了解物理学发展史
  13. 基于SLS构建RDS审计合规监控
  14. 一文快速理解23种经典设计模式
  15. 计算机真题11Excel,计算机网考真题EXCELPPT操作题答案(11页)-原创力文档
  16. 4.MySQL优化---多表查询优化
  17. sysadmin.php,骆驼IPTV源码及搭建教程(只提供源码和安装视频不提供任何技术支持)-396资源...
  18. decklink linux 驱动下载,Blackmagic Design DeckLink采集卡驱动
  19. Python : 批量替换代码文件内容,批量移动/覆盖文件
  20. 第一次创建STC15串口程序模板

热门文章

  1. OmniPeek tools install and setting
  2. Praat脚本-028 | 批量合并目录内的音频文件
  3. 跟踪算法-Meanshift算法
  4. 根据epc和ra定位linux kernel panic或者应用程序的出错位置
  5. 集成支付宝支付(AliPay)详解,防跳坑
  6. MySQL5.7.18安装卡在了starting server
  7. 黄海导航软件测试,测试软件平台环境一览
  8. 第世界上第一代电子计算机,第一代电子计算机
  9. linux搭建DNS域名解析服务
  10. 服务器微信了早上好,微信早晨好问候语句动态图片 早上好发给朋友的微信早安问候语简短...