图像的腐蚀和膨胀
《图像处理》实验8:二值图像膨胀、腐蚀

二值图像膨胀、 二值图像膨胀、腐蚀实验步骤
BYTE* TempData=new BYTE[linebytes*infoheader->biHeight]; memset(TempData,0,linebytes*infoh eader->biHeight); //开辟临时空间,存放数据 开辟临时空间, 开辟临时空间
实验八 二值图像膨胀、 二值图像膨胀、腐蚀
矿大信电学院 蔡利梅
一、实验目的
掌握二值图像膨胀、 掌握二值图像膨胀、腐蚀的基本方法 编程实现膨胀、 编程实现膨胀、腐蚀
二、实验原理
膨胀 腐蚀
二值图像膨胀、 二值图像膨胀、腐蚀实验步骤
打开应用程序Clm 打开应用程序 修改程序菜单 添加“二值图像处理”下拉菜单, 添加“二值图像处理”下拉菜单,并添加下 一级子菜单“膨胀” 一级子菜单“膨胀”,ID:ID_DILATION, : , 添加子菜单“腐蚀” 添加子菜单“腐蚀”,ID:ID_EROSION : 创建菜单项“膨胀” 腐蚀” 创建菜单项“膨胀” 、“腐蚀”的消息响 应函数OnDilation() 、OnErosion()。(基 。(基 应函数 。( 于CClmDoc类) 类
二值图像膨胀、 二值图像膨胀、腐蚀实验步骤
switch(nbtype) { case 0: nbw=1; nbh=3; break; case 1: nbw=3; nbh=1; break; case 2: nbw=3; nbh=3; break; case 3: nbw=5; nbh=5; break; }
二值图像膨胀、 二值图像膨胀、腐蚀实验步骤
BYTE* TempData=new BYTE[linebytes*infoheader->biHeight]; memset(TempData,255,linebytes*infohe ader->biHeight); //开辟临时空间,存放数据 开辟临时空间, 开辟临时空间
C++图像的膨胀和腐蚀

C++图像的膨胀和腐蚀二值图像是一种简单的图像格式,它只有两个灰度级,即"0"表示黑色的像素点,"255"表示白色的像素点,至于如何从一幅普通的图像获得二值图像,请参考我近期在天极网上发表的《Visual C++编程实现图像的分割》一文。
二值图像处理在图像处理领域占据很重要的位置,在具体的图像处理应用系统中,往往需要对于获得的二值图像再进一步进行处理,以有利于后期的识别工作。
二值图像处理运算是从数学形态学下的集合论方法发展起来的,尽管它的基本运算很简单,但是却可以产生复杂的效果。
常用的二值图像处理操作有许多方法,如腐蚀、膨胀、细化、开运算和闭运算等等。
本文对这些内容作些研究探讨,希望对爱好图像处理的朋友有所帮助。
一、腐蚀和膨胀形态学是一门新兴科学,它的用途主要是获取物体拓扑和结果信息,它通过物体和结构元素相互作用的某些运算,得到物体更本质的形态。
它在图像处理中的应用主要是:1.利用形态学的基本运算,对图像进行观察和处理,从而达到改善图像质量的目的;2.描述和定义图像的各种几何参数和特征,如面积,周长,连通度,颗粒度,骨架和方向性。
限于篇幅,我们只介绍简单二值图像的形态学运算,对于灰度图像的形态学运算,有兴趣的读者可以看有关的参考书。
二值图像基本的形态学运算是腐蚀和膨胀,简单的腐蚀是消除物体的所有边界点的一种过程,其结果是使剩下的物体沿其周边比原物体小一个像素的面积。
如果物体是圆的,它的直径在每次腐蚀后将减少两个像素,如果物体在某一点处任意方向上连通的像素小于三个,那么该物体经过一次腐蚀后将在该点处分裂为二个物体。
简单的膨胀运算是将与某物体接触的所有背景点合并到该物体中的过程。
过程的结果是使物体的面积增大了相应数量的点,如果物体是圆的,它的直径在每次膨胀后将增大两个像素。
如果两个物体在某一点的任意方向相隔少于三个像素,它们将在该点连通起来。
下面给出具体的实现腐蚀和膨胀的函数代码:////////////////////////////////二值图像腐蚀操作函数BOOL ImageErosion(BYTE *pData,int Width,int Height){//pData为图像数据的指针,Width和Height为图像的宽和高;BYTE* pData1;int m,n,i,j,sum,k,sum1;BOOL bErosion;if(pData==NULL){AfxMessageBox("图像数据为空,请读取图像数据");return FALSE;}//申请空间,pData1存放处理后的数据;pData1=(BYTE*)new char[WIDTHBYTES(Width*8)*Height];if(pData1==NULL){AfxMessageBox("图像缓冲数据区申请失败,请重新申请图像数据缓冲区");return FALSE ;}memcpy(pData1,pData,WIDTHBYTES(Width*8)*Height);for(i=10;i<Height-10;i++)for(j=32;j<Width-32;j++){bErosion=FALSE;sum=*(pData+WIDTHBYTES(Width*8)*i+j);if(sum==255){//求像素点八邻域的灰度均值;for(m=-1;m<2;m++){for(n=-1;n<2;n++){sum1=*(pData+WIDTHBYTES(Width*8)*(i+m)+j+n);if(sum1==0){*(pData1+WIDTHBYTES(Width*8)*i+j)=0;bErosion=TRUE;break;}}if(bErosion){bErosion=FALSE;break;}}}}memcpy(pData,pData1,WIDTHBYTES(Width*8)*Height); return TRUE;}////////////////////////////////////二值图像的膨胀操作BOOL ImageDilation(BYTE *pData,int Width,int Height){BYTE* pData1;int m,n,i,j,sum,k,sum1;BOOL bDilation;if(pData==NULL){AfxMessageBox("图像数据为空,请读取图像数据");return FALSE;}//申请空间,pData1存放处理后的数据;pData1=(BYTE*)new char[WIDTHBYTES(Width*8)*Height];if(pData1==NULL){AfxMessageBox("图像缓冲数据区申请失败,请重新申请图像数据缓冲区");return FALSE ;}memcpy(pData1,pData,WIDTHBYTES(Width*8)*Height);for(i=10;i<Height-10;i++)for(j=32;j<Width-32;j++){bDilation=FALSE;sum=*(pData+WIDTHBYTES(Width*8)*i+j);if(sum==0){//求像素点八邻域的灰度值;for(m=-1;m<2;m++){for(n=-1;n<2;n++){sum1=*(pData+WIDTHBYTES(Width*8)*(i+m)+j+n);if(sum1==255){*(pData1+WIDTHBYTES(Width*8)*i+j)=255;bDilation=TRUE;break;}}if(bDilation){bDilation=FALSE;break;}}}}memcpy(pData,pData1,WIDTHBYTES(Width*8)*Height);return TRUE;}从上面的说明可以看出,腐蚀可以消除图像中小的噪声区域,膨胀可以填补物体中的空洞。
图像的腐蚀和膨胀

图像的腐蚀和膨胀研究背景和意义依据数学形态学集合论方法发展起来的图像处理方法,在数字图像处理和机器视觉领域中得到了广泛的应用,形成了一种独特的数字图像分析和理论。
数学形态学是图像处理和模式识别领域的新方法,其基本的思想是:用具有一定形态的结构元素去度量和提取图像中的对应形状,已达到图像分析和识别的目的。
优势有一下几点:有效滤除噪声,保留图像中原有信息,算法很容易用并行处理方法有效实现,基于数学形态学的边缘信息提取处理优于基于微分运算的边缘提取算法,提取的边缘比较平滑,提取的图像骨架也比较连续,断点很少。
二.原理特殊领域运算形式——结构元素,在每个像素位置上与二值图像对应的区域进行特定的逻辑运算。
运算结果是输出图像的相应像素。
运算效果取决于结构元素大小、内容以及逻辑运算性质。
结构元素:膨胀和腐蚀操作的最基本组成部分,用于测试输出图像,通常要比待处理的图像小的多。
二维平面结构元素由一个数值为0或1的矩阵组成。
结构元素的原点(锚点)指定了图像中需要处理的像素范围,结构元素中数值为1的点决定结构元素的领域像素在进行膨胀或腐蚀操作时是否需要参与计算。
常见的形态学运算有腐蚀和膨胀两种:腐蚀:删除对象边缘某些像素。
膨胀:给图像中的对象边缘添加像素。
三.算法及效果图膨胀算法:用3X3的结构元素扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作,如果都为0,结果图像的该像素点为0,否则为1。
膨胀算法的效果是使二值图像扩大一圈。
腐蚀的算法:用3X3的结构元素,扫描图像的每一个像素点,用结构元素与其覆盖的二值图像做“与”操作,如果结果都为1,结果图像的该像素点为1,否则为0。
膨胀算法的结果:是二值图像减少一圈。
四.组合使用效果先腐蚀后膨胀的过程:利用它可以消除小物体,在纤细点处分离物体,平滑较大物体边界,但同时并不会明显改变原来物体的面积。
先膨胀后腐蚀的过程:利用它可以填充物体内细小空洞,连接临近物体、平滑其边界,但同时并不会明显改变原来物体的面积。
腐蚀膨胀算法原理

腐蚀膨胀算法原理
腐蚀膨胀算法(Erosion-DilationAlgorithm,缩写为EDA)是图像处理中最常用的算法之一。
它主要应用于图像的二值化处理,可以有效地消除图像中的噪声,以及实现图像中文字和物体的分割。
EDA是一种分水岭算法(Watershed Algorithm),该算法包括两个步骤,腐蚀和膨胀。
腐蚀步骤将从图像中提取图像对象的轮廓,而膨胀步骤将对象的轮廓填充,从而实现对图像对象的分割。
一般来说,EDA算法可以分为以下两步:
(1)腐蚀:腐蚀是图像处理中常用的技术,它的目的是去除图像中的噪声,消除图像中的噪点,并实现对图像中的文字或物体的轮廓提取。
腐蚀的基本原理是:使用一个结构元素(structuring element),它可以是不同类型的形状,如圆形、菱形、矩形等,将图像中某像素的非零元素替换为零。
(2)膨胀:膨胀是EDA算法中另一个重要的步骤,它是腐蚀的反向过程。
膨胀的基本原理是:使用一个结构元素将图像中某像素的零元素替换为非零元素,如果临近的像素是非零元素,则认为此像素属于某个对象的轮廓。
EDA算法的优点在于它既可以去除噪声,又可以实现文字或物体的分割。
此外,EDA算法还性能卓越,比一般算法要快得多,是图像处理中用到较多的算法之一。
但EDA算法也存在缺点:结构元素的选择不当,会影响到最终的结果;由于腐蚀操作的迭代,会导致目标图像的误差及失真问题;同
样,膨胀操作也会null影响图像的体积及精度。
总而言之,腐蚀膨胀算法是一种有效的图像处理算法,在图像的噪声消除、文字分割等应用中均有良好的效果,但也有一定的缺点,应该合理选择结构元素,以保证算法的正确性和最佳效果。
Python图像处理:图像腐蚀与图像膨胀

Python图像处理:图像腐蚀与图像膨胀图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要⽤来寻找图像中的极⼤区域和极⼩区域。
其中膨胀类似于“领域扩张”,将图像中的⾼亮区域或⽩⾊部分进⾏扩张,其运⾏结果图⽐原图的⾼亮区域更⼤;腐蚀类似于“领域被蚕⾷”,将图像中的⾼亮区域或⽩⾊部分进⾏缩减细化,其运⾏结果图⽐原图的⾼亮区域更⼩。
1.图像膨胀膨胀的运算符是“⊕”,其定义如下:该公式表⽰⽤B来对图像A进⾏膨胀处理,其中B是⼀个卷积模板或卷积核,其形状可以为正⽅形或圆形,通过模板B与图像A进⾏卷积计算,扫描图像中的每⼀个像素点,⽤模板元素与⼆值图像元素做“与”运算,如果都为0,那么⽬标像素点为0,否则为1。
从⽽计算B覆盖区域的像素点最⼤值,并⽤该值替换参考点的像素值实现膨胀。
下图是将左边的原始图像A膨胀处理为右边的效果图A⊕B。
2.图像腐蚀腐蚀的运算符是“-”,其定义如下:该公式表⽰图像A⽤卷积模板B来进⾏腐蚀处理,通过模板B与图像A进⾏卷积计算,得出B覆盖区域的像素点最⼩值,并⽤这个最⼩值来替代参考点的像素值。
如图所⽰,将左边的原始图像A腐蚀处理为右边的效果图A-B。
处理结果如下图所⽰:⼆. 图像腐蚀代码实现1.基础理论形态学转换主要针对的是⼆值图像(0或1)。
图像腐蚀类似于“领域被蚕⾷”,将图像中的⾼亮区域或⽩⾊部分进⾏缩减细化,其运⾏结果图⽐原图的⾼亮区域更⼩。
其主要包括两个输⼊对象:(1)⼆值图像(2)卷积核卷积核是腐蚀中的关键数组,采⽤numpy库可以⽣成。
卷积核的中⼼点逐个像素扫描原始图像,如下图所⽰:被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为1时,其值才为1,否则其值修改为0。
换句话说,遍历到的黄⾊点位置,其周围全部是⽩⾊,保留⽩⾊,否则变为⿊⾊,图像腐蚀变⼩。
2.函数原型图像腐蚀主要使⽤的函数为erode,其原型如下:dst = cv2.erode(src, kernel, iterations)参数dst表⽰处理的结果,src表⽰原图像,kernel表⽰卷积核,iterations表⽰迭代次数。
计算机视觉实验报告-对图像进行腐蚀和膨胀

1实验目的选取一张自己的生活照,实现:任选两种结构对图像进行腐蚀和膨胀。
边缘检测(分别使用Prewitt,两种大小的Sobel算子,不同参数的Canny算子,LoG算子),并对比各个算子实现差异及不同参数条件下的实验效果。
2实验过程2.1图像腐蚀和膨胀实验图片所用代码import cv2import numpy as npdef threshold(image, threshold):out = image.copy()out[out < threshold] = 0out[out > threshold] = 1out = out.astype(np.uint8)return out# 1. 读取图像文件image = cv2.imread('img/in.jpeg', cv2.IMREAD_GRAYSCALE)# 2. 缩放图像print('Shape: {}'.format(image.shape))image = cv2.resize(image, (256, 256), cv2.INTER_LINEAR)print('Shape: {}'.format(image.shape))# 3. 均一阈值分割binary = threshold(image, threshold=200)# 4. 腐蚀kernel_size = 5erode = cv2.erode(binary, kernel=np.ones((kernel_size, kernel_size)))# 5. 膨胀dilate = cv2.dilate(binary, kernel=np.ones((kernel_size, kernel_size)))# 6. 显示图像cv2.imshow('Image', image)cv2.imshow('Binary', binary * 255)cv2.imshow('Erode', erode * 255)cv2.imshow('Dilate', dilate * 255) cv2.waitKey(0)实验效果Kernel=5Kernel=25代码分析及现象腐蚀,消除连通的边界,使边界向内收缩。
二值形态学膨胀、腐蚀、开、闭运算opencv

【二值形态学膨胀、腐蚀、开、闭运算opencv的深度解析】一、概念介绍1. 二值形态学在图像处理中,二值形态学是一种针对二值图像进行的形态学操作,主要包括膨胀、腐蚀、开、闭运算等。
2. 膨胀膨胀是二值形态学中的一种基本操作,它能够使目标区域扩张并填充内部的空洞,从而使目标变大。
3. 腐蚀腐蚀是二值形态学中的另一种基本操作,它能够使目标区域收缩并去除边缘细节,从而使目标变小。
4. 开运算开运算是先腐蚀后膨胀的组合操作,可以用来去除图像中的噪声和小的干扰目标。
5. 闭运算闭运算是先膨胀后腐蚀的组合操作,可以用来填补图像中的小孔和裂缝。
二、深入探讨1. 膨胀的原理和作用膨胀通过结构元素的滑动来扩张目标区域,可以使目标变大,填充空洞,连接断裂的目标,是图像处理中常用的操作之一。
2. 腐蚀的原理和作用腐蚀通过结构元素的滑动来收缩目标区域,可以使目标变小,去除边缘细节,分离接触的目标,也是图像处理中常用的操作之一。
3. 开闭运算的应用场景开运算通常用于去除图像中的小噪声和杂点,可以平滑目标轮廓,提高目标边缘的连通性;闭运算通常用于填补图像中的小孔和断裂,可以使目标更加完整,减少断裂和裂缝。
4. opencv中的二值形态学函数opencv提供了丰富的二值形态学函数,可以方便地进行膨胀、腐蚀、开、闭运算,如cv2.dilate()、cv2.erode()、cv2.morphologyEx()等,可以通过设置结构元素的形状和大小来调整操作效果。
5. 个人观点和理解对于二值形态学操作,我认为膨胀和腐蚀是其基础,而开闭运算则是在这两者基础上的进一步应用,能够更加精细地处理目标区域,去除干扰和噪声,提取有效信息。
在实际应用中,需要根据具体情况选择不同的操作和参数,以达到最佳的处理效果。
三、总结回顾通过本文的介绍和分析,我们深入理解了二值形态学中的膨胀、腐蚀、开、闭运算的原理和作用,以及在opencv中的应用方式。
我们也从个人观点出发,探讨了这些操作的实际意义和效果。
形态学处理膨胀和腐蚀

形态学处理膨胀和腐蚀好嘞,今天我们聊聊形态学处理里的膨胀和腐蚀。
这听起来像是高深的科学名词,其实它们在图像处理里就像是咱们生活中的调味品,能让你的图像变得更美味。
想象一下,你在厨房里做饭,光有盐和胡椒可不够,还得有些独特的香料来提升风味。
膨胀和腐蚀就是这样的小秘密。
咱们来说说膨胀。
这就像是给图像穿了一层华丽的衣服,真是让人眼前一亮。
你想想,图像上的小点点在这个过程中就像是被“喂胖”了一样,慢慢膨胀开来。
你瞧,原本那些稀稀拉拉的像素瞬间变得丰满起来,边缘变得更加圆润,整个图像看起来更饱满、更有活力。
是不是感觉就像看到朋友从一个青涩少年变成了一个风度翩翩的大叔,心里那个自豪啊,真想给他来个大拇指!这样处理过的图像,边缘更光滑,缺口也不见了,真是妙不可言。
不过,膨胀也有它的小麻烦。
就好比我们偶尔吃多了,肚子胀得不行。
有些细节可能就被淹没了,原本清晰的轮廓可能变得模糊不清。
想象一下,你在画画,结果一不小心把颜色泼到了旁边,哎,真是得不偿失。
要是这图像里的信息被淹没了,那可就麻烦了。
所以,咱们在使用膨胀的时候,要谨慎点,心里得有数,别让它把一切都搞得一团糟。
接下来就是腐蚀了,听起来是不是有点严肃?别担心,这可不是要让你的图像变得灰暗。
腐蚀其实就像是给图像减肥,帮助那些多余的部分去掉。
就像你秋天扫落叶,清理掉那些多余的杂草,留下干净整洁的花园。
经过腐蚀处理后,图像的细节会更加明显,原本杂乱的背景也会变得更加整洁,仿佛一下子清晰了不少。
这时候,边缘变得尖锐了,形状更加分明。
就像你用刀切蛋糕,切出的每一块都是那么整齐。
可是,腐蚀也是有它的短板哦。
减肥太过了,可能连必要的部分也一起减掉,最终图像看起来就像是被削减了好几块,失去了原有的风采。
这样一来,原本生动的画面瞬间变得干瘪,真是让人心疼。
咱们再说说这两者的结合,嘿,这可是魔法般的存在。
膨胀和腐蚀如果搭档起来,简直就像是一个完美的舞蹈组合。
先来个膨胀,让图像膨胀得更丰满,再进行腐蚀,修剪掉那些不必要的部分,最终呈现出的效果,简直就像是经过打磨的璀璨钻石,闪闪发光。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图像的腐蚀和膨胀
研究背景和意义
依据数学形态学集合论方法发展起来的图像处理方法,在数字图像处理和机器视觉领域中得到了广泛的应用,形成了一种独特的数字图像分析和理论。
数学形态学是图像处理和模式识别领域的新方法,其基本的思想是:用具有一定形态的结构元素去度量和提取图像中的对应形状,已达到图像分析和识别的目的。
优势有一下几点:有效滤除噪声,保留图像中原有信息,算法很容易用并行处理方法有效实现,基于数学形态学的边缘信息提取处理优于基于微分运算的边缘提取算法,提取的边缘比较平滑,提取的图像骨架也比较连续,断点很少。
二.原理
特殊领域运算形式——结构元素,在每个像素位置上与二值图像对应的区域进行特定的逻辑运算。
运算结果是输出图像的相应像素。
运算效果取决于结构元素大小、内容以及逻辑运算性质。
结构元素:膨胀和腐蚀操作的最基本组成部分,用于测试输出图像,通常要比待处理的图像小的多。
二维平面结构元素由一个数值为0或1的矩阵组成。
结构元素的原点(锚点)指定了图像中需要处理的像素范围,结构元素中数值为1的点决定结构元素的领域像素在进行膨胀或腐蚀操作时是否需要参与计算。
常见的形态学运算有腐蚀和膨胀两种:
腐蚀:删除对象边缘某些像素。
膨胀:给图像中的对象边缘添加像素。
三.算法及效果图
膨胀算法:用3X3的结构元素扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作,如果都为0,结果图像的该像素点为0,否则为1。
膨胀算法的效果是使二值图像扩大一圈。
腐蚀的算法:用3X3的结构元素,扫描图像的每一个像素点,用结构元素与其覆盖的二值图像做“与”操作,如果结果都为1,结果图像的该像素点为1,否则为0。
膨胀算法的结果:是二值图像减少一圈。
四.组合使用效果
先腐蚀后膨胀的过程:利用它可以消除小物体,在纤细点处分离物体,平滑较大物体边界,但同时并不会明显改变原来物体的面积。
先膨胀后腐蚀的过程:利用它可以填充物体内细小空洞,连接临近物体、平滑其边界,但同时并不会明显改变原来物体的面积。
通常由于噪声的影响,图像在阈值化后所得到的边界通常都很不平滑,物体区域具有一些噪声孔,而背景区域上散布着一些小的噪声物体,连续的开和闭运算可以有效的改善这种情况。
而有时,我们需要经过多次腐蚀,然后再加上相同次数的膨胀,才能产生比较好的处理效果。
可见图像的腐蚀与膨胀相结合有时可以使图像有较理想的处理效果。
图像处理分为多种,对于不同的图像腐蚀和膨胀的定义不同。
1. 形态学图像处理是在图像中移动一个结构元素,然后将结构元素
与下面的二值图像进行交、并等集合运算;
先腐蚀后膨胀的过程称为开运算。
它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。
先膨胀后腐蚀的过程称为闭运算。
它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用。
2. 对灰度图像的膨胀(或腐蚀)操作有两类效果:
(1)如果结构元素的值都为正的,则输出图像会比输入图像亮(或暗);
(2)根据输入图像中暗(或亮)细节的灰度值以及它们的形状相对于结构元素的关系,它们在运算中或被消减或被除掉。
using System;
using System.Collections.Generic;
using ponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void LockUnlockBitsExample(PaintEventArgs e)
{
//Create a new bitmap
Bitmap bmp = new Bitmap("house.jpg");
//Lock the bitmap's bits
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);
//Get the address of the fist line
IntPtr ptr = bmpData.Scan0;
//Declare an array to hold the bytes of the bitmap
int bytes = Math.Abs(bmpData.Stride) * bmp.Height;
byte[] rgbValues = new byte[bytes];
//Copy the RGB values into the array
Marshal.Copy(ptr, rgbValues, 0, bytes);
//Set every third value to 255. A 24bpp bitmap will look red
for (int counter = 2; counter < rgbValues.Length; counter += 3 ) {
rgbValues[counter] = 255;
}
//Copy the RGB values back to the bitmap
Marshal.Copy(rgbValues, 0, ptr, bytes);
//Unlock the bits
bmp.UnlockBits(bmpData);
//Draw the modified image
e.Graphics.DrawImage(bmp, 0, 150);
}
}
}。