图像处理——灰度化、二值化、膨胀算法、腐蚀算法以及开运算和闭运算
一、RGB
RGB色彩模式使用RGB模型为图像中每个像素的RGB分量分配一个0~255范围内的强度值。RGB图像仅仅使用三种颜色,R(red)、G(green)、B(blue),就能够使它们依照不同的比例混合,在屏幕上呈现16777216(256 * 256 * 256)种颜色。
在电脑中,RGB的所谓“多少”就是指亮度,并使用整数来表示。通常情况下,RGB各有256级亮度,用数字表示为从0、1、2...直到255。
二、ARGB
三、灰度化
四、二值化
public Bitmap binarization(){Bitmap bitImage = new Bitmap(pictureBox1.Image);//二值化pictureBox1中的图片Color c;int height = pictureBox1.Image.Height;int width = pictureBox1.Image.Width;for (int i = 0; i < height; i++){for (int j = 0; j < width; j++){c = bitImage.GetPixel(j,i);int r = c.R;int g = c.G;int b = c.B;if ((r + g + b) / 3 >= 127){ bitImage.SetPixel(j, i, Color.FromArgb(255, 255, 255)); }else{ bitImage.SetPixel(j, i, Color.FromArgb(0,0,0));}}}return bitImage;}
![](/assets/blank.gif)
五、膨胀算法
膨胀是将与物体接触的全部背景点合并到该物体中,使边界向外部扩张的过程。
能够用来填补物体中的空洞。
用3x3的结构元素,扫描图像的每个像素
用结构元素与其覆盖的二值图像做“或”操作
假设都为0,结果图像的该像素为0。否则为1
结果:使二值图像扩大一圈
膨胀(dilation)能够看做是腐蚀的对偶运算,其定义是:把结构元素B平移a后得到Ba,若Ba击中X,我们记下这个a点。全部满足上述条件的a点组成的集合称做X被B膨胀的结果。用公式表示为:D(X)={a | Ba↑X}=XB,例如以下图所看到的。图中X是被处理的对象,B是结构元素,不难知道,对于随意一个在阴影部分的点a,Ba击中X,所以X被B膨胀的结果就是那个阴影部分。阴影部分包含X的全部范围,就象X膨胀了一圈似的,这就是为什么叫膨胀的原因。
在下图中,左边是被处理的图象X(二值图象,我们针对的是黑点),中间是结构元素B。膨胀的方法是,拿B的中心点和X上的点及X周围的点一个一个地对,假设B上有一个点落在X的范围内,则该点就为黑;右边是膨胀后的结果。能够看出,它包含X的全部范围,就象X膨胀了一圈似的。
我设计了一个简单的膨胀算法,依次遍历整个图片的像素,分析每个像素的周围八个像素,仅仅要该像素周围存在黑色的像素,就设置该像素颜色为黑色。以下是使用膨胀算法处理经过二值化后的图像的C#实现代码:
public bool[] getRoundPixel(Bitmap bitmap, int x, int y)//返回(x,y)周围像素的情况,为黑色,则设置为true{bool[] pixels=new bool[8];Color c;int num = 0;for (int i = -1; i < 2; i++){for (int j = -1; j < 2; j++){c = bitmap.GetPixel(x+i,y+j);if (i != 0 || j != 0){if (255 == c.G)//由于经过了二值化,所以仅仅要检查RGB中一个属性的值{pixels[num] = false;//为白色,设置为falsenum++;}else if(0==c.G){pixels[num] = true;//为黑色,设置为truenum++;}}}}return pixels;}
public Bitmap expend(){Bitmap bitImage = new Bitmap(pictureBox2.Image);//处理pictureBox2中的图片Bitmap bitImage1 = new Bitmap(pictureBox2.Image);int height = pictureBox1.Image.Height;int width = pictureBox1.Image.Width;bool[] pixels;for (int i = 1; i < width-1; i++){for (int j = 1; j < height-1; j++){if (bitImage.GetPixel(i, j).R != 0){pixels = getRoundPixel(bitImage, i, j);for (int k = 0; k < pixels.Length; k++){if (pixels[k] == true){//set this piexl's color to blackbitImage1.SetPixel(i, j, Color.FromArgb(0,0,0));break;}}}}}return bitImage1;}
执行结果如图:
六、腐蚀算法
腐蚀是一种消除边界点,使边界向内部收缩的过程。能够用来消除小且无意义的物体。
用3x3的结构元素,扫描图像的每个像素
用结构元素与其覆盖的二值图像做“与”操作
假设都为1,结果图像的该像素为1。否则为0。
结果:使二值图像减小一圈
把结构元素B平移a后得到Ba,若Ba包括于X,我们记下这个a点,全部满足上述条件的a点组成的集合称做X被B腐蚀(Erosion)的结果。用公式表示为:E(X)={a| Ba X}=X
B。
下图中X是被处理的对象,B是结构元素。不难知道,对于随意一个在阴影部分的点a,Ba包括于X,所以X被B腐蚀的结果就是那个阴影部分。阴影部分在X的范围之内,且比X小,就象X被剥掉了一层似的,这就是为什么叫腐蚀的原因。
我设计了一个简单的腐蚀算法,一次遍历图像中每个像素,检查它四周的八个像素,假设有白色的像素,则设置改点为白色。用二值化处理后的图片进行腐蚀算法C#代码例如以下:
public Bitmap corrode(){Bitmap bitImage = new Bitmap(pictureBox2.Image);Bitmap bitImage1 = new Bitmap(pictureBox2.Image);Color c;int height = pictureBox1.Image.Height;int width = pictureBox1.Image.Width;bool[] pixels;for (int i = 1; i < width - 1; i++){for (int j = 1; j < height - 1; j++){c = bitImage.GetPixel(i, j);if (bitImage.GetPixel(i, j).R == 0){pixels = getRoundPixel(bitImage, i, j);for (int k = 0; k < pixels.Length; k++){if (pixels[k] == false){//set this piexl's color to blackbitImage1.SetPixel(i, j, Color.FromArgb(255, 255, 255));break;}}}}}return bitImage1;}
处理后图片变成:
七、开运算
先腐蚀后膨胀的过程称为开运算。用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同一时候并不明显改变其面积。
八、闭运算
先膨胀后腐蚀的过程称为闭运算。用来填充物体内细小空洞、连接邻近物体、平滑其边界的同一时候并不明显改变其面积。
图像处理——灰度化、二值化、膨胀算法、腐蚀算法以及开运算和闭运算相关推荐
- Java图像处理:灰度、二值化、浮雕、去色、反向、怀旧、放大镜等
图像是由一个个像素点组合而成,图像处理本身实际上是遍历图像的像素点,对像素点的RGB值进行更改,以达到图像处理的目的. 接下来,我们主要介绍一下图片转化为二维像素点数组的方法以及部分图像处理如灰度.二 ...
- 图像灰度、二值化、膨胀和腐蚀(纯Java篇)
在c.c++或者python环境中可以使用opencv非常容易实现图像灰度.二值化.膨胀和腐蚀等功能:但在java环境中,使用opencv来处理相对比较麻烦,简单的操作用opencv处理也相对过重,这 ...
- 示例程序009--阙值化(二值化,cvThreshold)
涉及的函数: cvSplit 分割多通道数组成几个单通道数组或者从数组中提取一个通道 void cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1, ...
- 图像处理中的二值化和灰度化
图像的灰度化: 灰度是指只含亮度信息,不含色彩信息的图像.黑白照片就是灰度图,特点是亮度由暗到明,变化是连续的.要表示灰度图,就需要把亮度值进行量化 使用灰度图的好处: ① RGB的值都一样. ② 图 ...
- 计算机视觉基础-图像处理(图像分割/二值化)cpp+python
5.1 简介 该部分的学习内容是对经典的阈值分割算法进行回顾,图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单.计算量小.性能较稳定而成为图像分割中最基本和应用最广泛的分割技术.它特别适用 ...
- 计算机视觉基础-图像处理 Task05 图像分割/二值化
文章目录 OSTU二值化 自适应阈值 函数实现 OSTU二值化 自适应阈值 图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单.计算量小.性能较稳定而成为图像分割中最基本和应用最广泛的分割技 ...
- 灰度图片二值化matlab
rge图片灰度化之后,往往存在灰度值比较近的情况.根据自己的需求将灰度值调到两个极端值,也叫做阈值处理. 本文的阈值是自定义的,建立在已经读取到灰度图片灰度值的基础之上. 存在获取灰度图片最佳阈值的算 ...
- java入门之 美图相机(原图、灰度、二值化、马赛克、融合、轮廓获取)
编写美图相机时,我们首先需要了解图片再计算机中的存储形式,详情可见http://t.csdn.cn/MgOfO 目录 <1>创建显示图片的主界面 1.添加窗体,用数列添加按钮,设置窗体可视 ...
- 计算机视觉基础-图像处理之图像分割/二值化
阈值分割基本概念 二值化就是让图像的像素点矩阵中的每个像素点的灰度值为0(黑色)或者255(白色),也就是让整个图像呈现只有黑和白的效果,在灰度化的图像中灰度值的范围为0~255,在二值化后的图像中的 ...
- python_opencv(cv2)模块+灰度图二值化及降噪处理
1.安装: 网上说的那些,pip install cv2, opnecv. 全!都!是!坑!爹!的! 正确的操作方式如下: pip install opencv-python 2.具体用法: 长期更新 ...
最新文章
- 公共基础——树,二叉树,软件结构图
- python的中文含义-python __all__ 含义
- 剑指Offer面试题:2.二维数组中的查找
- tornado post第3方_[33]python-Web-框架-Tornado
- 基于android公交车线路查询论文文献,本科毕业论文---基于android的手机公交线路查询系统.doc...
- codeforces 266B-C语言解题报告
- 基于Hadoop架构下的FineBI大数据引擎技术原理
- 漫步线性代数十三——线性变换
- SetZOrder 无效
- 物联网发展 制定技术标准才能更好监管
- 1079 Total Sales of Supply Chain(25 分)
- sunshine in the rain
- 苹果手机显示有4g上不了网络连接服务器,苹果移动数据为什么叫蜂窝网络_蜂窝移动数据和4g有什么区别...
- Ucinet三天写论文!自同构对等分析实战
- linux ubuntu木马,Ubuntu病毒查杀 ClamAV 简介以及适用范围
- zabbix短信告警oracle,zabbix自定义脚本实现短信报警提醒
- 关于小虾米大学尾声的感慨
- OR(odd ratios)
- 数据库的读写分离方案
- onLoad onShow