图像处理——灰度化、二值化、膨胀算法、腐蚀算法以及开运算和闭运算

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

一、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

一种 色彩模式,也就是 RGB色彩模式附加上Alpha( 透明度)通道,常见于32位 位图存储结构
ARGB---Alpha,Red,Green,Blue.


三、灰度化

 在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。一般有以下四种方法对彩色图像进行灰度化,具体方法参考: http://blog.csdn.net/evsqiezi/article/details/7905436   


四、二值化

一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,最常用的方法就是设定一个全局的阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。将大于T的像素群的像素值设定为白色(或者黑色),小于T的像素群的像素值设定为黑色(或者白色)。
比如:计算每一个像素的(R+G+B)/3,如果>127,则设置该像素为白色,即R=G=B=255;否则设置为黑色,即R=G=B=0。
C#实现代码如下:
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;
        }
运行结果如图:
左边为处理前,右边为二值化后效果。


五、膨胀算法

膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。

可以用来填补物体中的空洞。

 

3x3的结构元素,扫描图像的每一个像素

用结构元素与其覆盖的二值图像做操作

如果都为0,结果图像的该像素为0。否则为1

结果:使二值图像扩大一圈


膨胀(dilation)可以看做是腐蚀的对偶运算,其定义是:把结构元素B平移a后得到Ba,若Ba击中X,我们记下这个a点。所有满足上述条件的a点组成的集合称做XB膨胀的结果。用公式表示为:D(X)={a | BaX}=X腐蚀,膨胀,细化算法B,如下图所示。图X是被处理的对象,B是结构元素,不难知道,对于任意一个在阴影部分的点aBa击中X,所以XB膨胀的结果就是那个阴影部分。阴影部分包括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;//为白色,设置为false
                            num++;
                        }
                        else if(0==c.G)
                        {
                            pixels[num] = true;//为黑色,设置为true
                            num++;
                        }
                    }
                }
            }
            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 black
                                bitImage1.SetPixel(i, j, Color.FromArgb(0,0,0));
                                break;
                            }
                        }
                    }
                }
            }
                return bitImage1;

        }


运行结果如图:


六、腐蚀算法


腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。



3x3的结构元素,扫描图像的每一个像素


用结构元素与其覆盖的二值图像做操作


如果都为1,结果图像的该像素为1。否则为0


结果:使二值图像减小一圈

把结构元素B平移a后得到Ba,若Ba包含于X,我们记下这个a点,所有满足上述条件的a点组成的集合称做XB腐蚀(Erosion)的结果。用公式表示为:E(X)={a| Ba 腐蚀,膨胀,细化算法X}=X 腐蚀,膨胀,细化算法B。



下图中X是被处理的对象,B是结构元素。不难知道,对于任意一个在阴影部分的点aBa包含于X,所以XB腐蚀的结果就是那个阴影部分。阴影部分在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 black
                                bitImage1.SetPixel(i, j, Color.FromArgb(255, 255, 255));
                                break;
                            }
                        }
                    }
                }
            }
            return bitImage1;
        }

处理后图片变成:



七、开运算

先腐蚀后膨胀的过程称为开运算。用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。


八、闭运算

先膨胀后腐蚀的过程称为闭运算。用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。



二值化方法 一、全局阈值法 1.固定阈值方法 该方法是对于输入图像中的所有像素点统一使用同一个固定阈值。其基本思想如下: 其中,T为全局阈值。 缺点:很难为不同的输入图像确定最佳阈值。 2.Otsu算法 Otsu算法又称最大类间方差法 先明确两个概念: (1)均值 (2)方差 图像的阈值化处理,就是将图像分为两个部分,高于阈值的部分,小于阈值的部分。(暂不考虑多阈值的情况)。那么,如果将图像的每一个像素点的强度作为一个数据集合中的单元,那么,阈值化就相当于是一个二... 阅读详情

相关推荐

图像处理灰度化二值化腐蚀膨胀

灰度化,在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值。 二值图像(Binary Image)是指将图像上的每一个像素只有两种可能的取值或灰度等级状态 腐蚀就是将图像的边缘腐蚀掉。作用就是将目标的边缘的“毛刺”踢除掉。 膨胀就是将图像的边缘扩大些。作用就是将目标的边缘或者是内部的坑填掉。 使用腐蚀膨胀,可以使目标表面更平滑。 import cv2 import numpy import numpy as np f

weixin_48262500的博客 2520

数字图像处理中的二值化 运算 运算 有图

二值化 运算 运算 带图 详细代码 数字图像处理学习有用

形态学腐蚀膨胀原理python实现

形态学腐蚀膨胀原理python实现 这篇笔记为形态学膨胀(dilate)腐蚀(erode),一种在数字图像处理中常用的基本算法。 形态学图像处理的理论根基是数学形态学(Mathematical Morphology),可以通过形态学处理获取图像中有意义的区域,比如边界信息。 形态学最基本的操作为腐蚀膨胀,我个人的理解,就是让图像中的感兴趣目标变大或者变小。自己做了下面这个小例子: 原始的图片是一张笑脸,erode(腐蚀)就是让图像中笑脸轮廓变细,而dilate(膨胀)就是让图像中笑.

qq_36955294的博客 1541

图像灰度、二值化膨胀腐蚀(纯Java篇)

在c、c++或者python环境中可以使用opencv非常容易实现图像灰度、二值化膨胀腐蚀等功能;但在java环境中,使用opencv来处理相对比较麻烦,简单的操作用opencv处理也相对过重,这里记录下java版图片相关处理。 原图: 1、灰度图 public static void main(String[] args) throws Exception { File file = new File("test.png"); BufferedImage

YY007H的博客 4235

图像处理一(大津二值化膨胀腐蚀

1:大津二值化 二值化二值化是将图像使用黑白两种颜色表示的方法,可以凸显图像的轮廓。 我们将灰度的阈值设置为N来进行二值化,即: 一张图片采用不同的阀值进行二值化后得到的图像差距很大,如下图所示: 原图: 以下分别是阀值为50、 70、150时二值化的结果: 可以看到只有合适的阀值才能很好的二值化图像,如何自动的确定阀值呢? 大津二值化算法(OTSU)算法是由日本学者OTSU于197...

qq_39107882的博客 1913

数字图像处理(八)形态学处理之灰度级腐蚀膨胀运算运算、顶帽变换底帽变换

本篇所有代码都是基于24位BMP图像一. 灰度级腐蚀运算灰度级腐蚀运算可以看成一种特殊的二维卷积运算,只不过用最小值运算代替了相关运算,用减法运算代替了相关运算的卷积操作。灰度腐蚀运算时逐点进行的,计算该点局部范围内各点与结构元素对应点的灰度差,并选取差的最小值,作为该点的腐蚀结果。(先赋值255,再赋值差的最小值)1.如果结构元素都是正的,则输出图像会比输入图像暗。我们设结构元素3*3,且值都是...

hjxu2016的博客 1万+

灰度化二值化膨胀算法腐蚀算法以及运算运算

一、RGB RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。RGB图像只使用三种颜色,R(red)、G(green)、B(blue),就可以使它们按照不同的比例混合,在屏幕上呈现16777216(256 * 256 * 256)种颜色。 在电脑中,RGB的所谓“多少”就是指亮度,并使用整数来表示。通常情况下,RGB各有256级亮度,用数字

Biao 1万+

图像处理常用八大算法

前言 图片处理是发过程中经常遇到要处理的问题,毕竟图片是比较耗系统资源,网络资源,存储空间。。。,因此,图片的处理显得格外重要,去百度查阅资料,就会看到很多关于读片处理的方法,以及图片的加载框架,他们都是用来处理图片的。 常见的图片处理方式大概有如下几类。比如图片的等比缩放,图片海量加载,图片的裁剪,图片的无损压缩,图片的旋转,图片实现画中画,图片实现阴影,改变图片形状等 然后,这些操作只是符...

hirezy 5万+

关于形态学膨胀腐蚀的学习

形态学膨胀腐蚀是为了让目标物体更好的被发现,先膨胀腐蚀是为了消除目标中可能存在的洞或孔,先腐蚀膨胀是为了让目标外的小白点(大概是这个意思)。具体请参考: 膨胀腐蚀解释 根据这篇文章,我复现了一遍程序,首先找到一张合适的图像,如图所示: 复现这篇代码首先检查下你现有版本的python中是否安装了matplotlib,如果没有安装下面程序是跑不出来的。 安装教程 下面是安装教程中检测matplotlib是否正确安装的代码: # coding=gbk 用来支持中文输入 import matplotli

qq_44965200的博客 620

python 腐蚀膨胀_形态学腐蚀膨胀原理python实现

这篇笔记为形态学膨胀(dilate)腐蚀(erode),一种在数字图像处理中常用的基本算法。形态学图像处理的理论根基是数学形态学(Mathematical Morphology),可以通过形态学处理获取图像中有意义的区域,比如边界信息。形态学最基本的操作为腐蚀膨胀,我个人的理解,就是让图像中的感兴趣目标变大或者变小。自己做了下面这个小例子:原始的图片是一张笑脸,erode(腐蚀)就是让图像中笑...

weixin_39968722的博客 1008

数字图像处理——实验三 形态学图像处理实验

基本的形态学图像处理的实现

糖糖不是堂的博客 2479

什么叫做形态学图像处理_形态学腐蚀膨胀原理python实现

这篇笔记为形态学膨胀(dilate)腐蚀(erode),一种在数字图像处理中常用的基本算法。形态学图像处理的理论根基是数学形态学(Mathematical Morphology),可以通过形态学处理获取图像中有意义的区域,比如边界信息。形态学最基本的操作为腐蚀膨胀,我个人的理解,就是让图像中的感兴趣目标变大或者变小。自己做了下面这个小例子:原始的图片是一张笑脸,erode(腐蚀)就是让图像中笑...

weixin_39554891的博客 984

膨胀腐蚀及底层实践,拒绝opencv,matlab等方式

结构元素是一个小的矩阵模板(通常是正方形、圆形或十字形),它是膨胀腐蚀的“操作核心”。矩阵里有锚点(Anchor Point):一般是矩阵的中心像素,相当于印章的“把手”,操作时锚点会遍历图像的每个像素。矩阵值只有01:1的区域代表“有效作用范围”,0的区域不参与计算。概念核心操作关键工具典型应用结构元素矩阵模板大小、形状、锚点决定膨胀/腐蚀的作用方式腐蚀前景缩小结构元素遍历检查去噪、分离物体膨胀前景扩大结构元素遍历检查补洞、连接物体。

qq_19432525的博客 666

Python+OpenCV图像处理与识别 Step by Step

我们理解图像识别,总体上分三步: 图像的采集 图像的处理 图像的识别 其中,图像采集处理是相辅相成的,如果图像的采集能够保证明暗色彩等要素的稳定统一,那么在处理图像时成功率会提升很多;反之如果图像处理算法足够强大,对图像采集的要求就会相对的降低。 而只有正确的进行了图像的处理后,图像才能够被识别。 图像的采集 图像采集需尽可能的保证图像的一致性,即图像的明暗...

夜星繁的博客 1万+

FPGA图像处理(六)------ 图像腐蚀and图像膨胀

/ Description: 图像膨胀 (前景色是黑色,背景色是白色 只要覆盖区域有前景色则膨胀黑色)//常量声明//窗口大小//结构系数模版为{1,1,1,1,1,1,1,1,1}//变量声明//中心点位置,为cur_line_data_d1endend//模板窗口范围内判断,前景色是黑色,背景色是白色,膨胀处理就是前景色黑色扩张//简单理解也就是,3*3窗口中所有像素值都是255(白)时,才能将当前像素值为255输出end。

mvpkuku的博客 1008

数字图像处理MATLAB大作业:基础版

基于MATLAB实现数字图像处理

qq_53384631的博客 2万+

[Python图像处理] 三十一.图像点运算处理两万字详细总结(灰度化处理、阈值化处理)

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~ 前面一篇文章介绍了图像量化及采样处理,这篇文章将结合作者研究民族服饰及文化图腾识别,详细讲解图像点运算,包括灰度化处理、灰度线性变换、灰度非线性变换、阈值化处理,万字长文吐血整理,希望对您有所帮助。

杨秀璋的专栏 7315
上一篇: VS中生成、清理项目、调试、开始执行(不调试)、Debug 和 Release等之间的区别
下一篇: “无法启动程序,因为计算机中丢失MSVCP100D.dll”的解决方案
try-catch-finally
博客等级 码龄16年 48粉丝 20原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值