使用C#进行图像处理
使用C#进行图像处理
前言
之前一直认为图像处理是一件很高大上的事情,在一门选修课的课上遇到一个图像处理的作业,上手几个简单的图像处理的算法,也算是入了个最简单的门。
界面简单而又丑陋,代码命名也比较随意,大家重点关注算法就好
在这里一共实现了暗角、降低亮度、灰度、浮雕、马赛克、扩散六个算法。
项目github地址:https://github.com/wchstrife/ImageProcessing
界面设计
文件打开与保存
这里主要就是调用了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("保存失败,你还没有截取过图片或已经清空图片!");}}}}}
添加暗角
基本步骤:
- 计算顶点与中心的距离maxDistance
- 计算每个像素点与中心的距离distance
- 计算factor = distance / maxDistance
- 将当前像素点的颜色设置为 原颜色 * (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#进行图像处理相关推荐
- 图像处理 100 问!!
图像处理 100 问!! 参考链接地址:https://github.com/gzr2017/ImageProcessing100Wen English is here (KuKuXia transl ...
- 《OpenCV3编程入门》学习笔记6 图像处理(三)形态学滤波(1):腐蚀与膨胀
第6章 图像处理 6.3 形态学滤波(1):腐蚀与膨胀 6.3.1 形态学概述 1.数学形态学(Mathematical morphology):建立在格论和拓扑学基础上的图像分析学科,是数学形态学图 ...
- 《OpenCV3编程入门》学习笔记6 图像处理(二)非线性滤波:中值滤波、双边滤波
第6章 图像处理 6.2 非线性滤波:中值滤波.双边滤波 6.2.1 非线性滤波 很多情况下,使用领域像素的非线性滤波会得到更好的效果,如在噪声是散粒噪声而不是高斯噪声,即图像偶尔会出现很大值时,高斯 ...
- 《OpenCV3编程入门》学习笔记6 图像处理(一)线性滤波:方框滤波、均值滤波、高斯滤波
第6章 图像处理 6.1 线性滤波:方框滤波.均值滤波.高斯滤波 6.1.1 图像滤波与滤波器 1.图像滤波:在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制 目的: (1)抽出对象的特征作为图 ...
- Python,OpenCV图像处理超好用的工具包imutils
imutils是我崇拜的大佬Adrian贡献的源码包,其中包含许多图像处理便捷的方法: 安装: pip install imutils 包含的工具类及方法列表: 图像平移方法 # 平移向右25px,向 ...
- Image Processing图像处理(对比俩张图像的差异并且在图上标注出来)
图像处理是构建所有计算机视觉的基础.按照我的图像处理指南使用OpenCV库学习计算机视觉的基础知识. SSIM进阶,利用python & openCV将图片的差异性画框展示出来. 诀窍是学习如 ...
- 数字图像处理:边缘检测(Edge detection)
转载自:https://zhuanlan.zhihu.com/p/59640437 觉得写得通俗易懂,要是每个人的博客都这么人性化.... 写在前面: 本文篇幅较长,用了大量图与公式帮助大家深入理解各 ...
- 数字图像处理:(1)图像梯度以及算子应用
1.数学意义上的梯度 在理解图像梯度是什么的时候,我们首先要回忆一下以前学习过得梯度是什么? 见链接: https://blog.csdn.net/m0_37957160/article/detail ...
- 数字图像处理:图像就是函数的解读
计算机视觉旨在从图像中提取有用的信息,这已经被证实是一个极具挑战性的任务.那么图像是什么?或者说我们把图像看作什么? 有人说图像就是一张图片,一个场景,一个矩形(rectangle),一个矩阵(mat ...
- 数字图像处理:blob分析、阈值分割
1.Blob分析: 1.1.blob分析概念在计算机视觉中的Blob(Binary large object)是指图像中的具有相似颜色.纹理等特征所组成的一块连通区域,一般来说,该区域就是图像中的前景 ...
最新文章
- windows 7使用CAJViewer时出错显示缺少ReaderEX.dll处理
- fetch 跨域请求
- PaddleDetection 个人测评
- html响应式导航栏制作,用Sass制作响应式导航栏(原创)
- 根可达算法的根_GC垃圾回收算法
- 机器人学习--Robotics 4:Perception(宾夕法尼亚大学COURSERA课程)
- 从三大顶会论文看百变Self-Attention
- junit4使用心得
- SAP Cloud for Customer根据Accouunt自动带出Sales Unit的配置
- python 进程池 等待数量_【2020Python修炼记】python并发编程(六)补充—进程池和线程池...
- TensorFlow报错run() got multiple values for argument 'feed_dict'
- 3分钟了解物理学发展史
- 基于SLS构建RDS审计合规监控
- 一文快速理解23种经典设计模式
- 计算机真题11Excel,计算机网考真题EXCELPPT操作题答案(11页)-原创力文档
- 4.MySQL优化---多表查询优化
- sysadmin.php,骆驼IPTV源码及搭建教程(只提供源码和安装视频不提供任何技术支持)-396资源...
- decklink linux 驱动下载,Blackmagic Design DeckLink采集卡驱动
- Python : 批量替换代码文件内容,批量移动/覆盖文件
- 第一次创建STC15串口程序模板
热门文章
- OmniPeek tools install and setting
- Praat脚本-028 | 批量合并目录内的音频文件
- 跟踪算法-Meanshift算法
- 根据epc和ra定位linux kernel panic或者应用程序的出错位置
- 集成支付宝支付(AliPay)详解,防跳坑
- MySQL5.7.18安装卡在了starting server
- 黄海导航软件测试,测试软件平台环境一览
- 第世界上第一代电子计算机,第一代电子计算机
- linux搭建DNS域名解析服务
- 服务器微信了早上好,微信早晨好问候语句动态图片 早上好发给朋友的微信早安问候语简短...