本帖最后由 Marco 于 2016-9-27 16:27 编辑
在前面的文章中,已经了解到LeadTools是如何加载与显示图像。这篇文章中,主要想和大家分享下LeadTools是如何获取图像的像素值,并对其加以操作的。提到图像的像素值,首先想在这里说明下图像的位深。我们经常说到8bit图像,也就是说一个像素是8bit, 只有一个值(0-255)。对于RGB图像来说,是一幅24bit图像,每一个像素上有三个值,分别是R,G,B三种颜色的分量。 LeadTools提供了如下这个函数用于获取图像上的像素值: - Data=Image.GetPixelData(Row, Column);
复制代码其中Data 是一个byte类型的数组,image是加载的图像,Row ,Column分别代表图像的行与列。即通过GetPixelData这个函数可以获取到图像上Row行,Column列这一点的像素值。如果图像是8bit图像则Data即为一个长度为1 的数组,如果图像是RGB图像,则Data是一个长度为3的数组,分别存放着R,G,B三个颜色的分量。 同时,LeadTools也提供了改变图像上某点像素值的函数: - Image.SetPixelData(Row, Column, Data)
复制代码即将Image 图像上Row行,Column列这一点的像素值变成Data
具体在Image Features——Image Processing——Manipulating Bitmap Data. 在了解了这两个函数之后,我们便可对图像的像素值进行操作。如下图像所示,一张纯白的背景上有一个黑色的圆圈。下面这个demo实现的就是将背景变为黑色,圆圈变为白色。
这个Demo是在教程(一)的代码基础上继续改进的,所以之前的配置设置就不在这里详细描述。具体步骤如下: 1. 在Form1设计模式中,再添加一个button控件,ImageViewer控件分别改名为change,theViewer2.这样就有了两个按钮,两个显示控件。其中第一个按钮用于载入原始图片,显示原始图片。第二个按钮用于处理原始图片,显示处理之后的图片。 2. 切换到From1代码模式,在using之后,添加如下代码(添加之前还是要先添加引用,具体见教程一)。 - using Leadtools.ImageProcessing;
- using Leadtools.ImageProcessing.Core;
- using Leadtools.Drawing;
- using Leadtools.Dicom;
复制代码3. 在Public Form1()中添加如下代码: - RasterImageViewer theViewer2;
- theViewer2 = new RasterImageViewer();
复制代码4. 在public partial class Form1 : Form 这个类中,重新定义图形变量,并将教程一中button1.click()事件中的该变量删除 5. 切换回到Form1设计页面,双击button2则代码页面会出现button2.click()事件,在该事件中添加如下代码: - //创建一个与image 大小,位深相同的图像在内存中用于存储处理之后的图像
- RasterImage destImage = new RasterImage(
- RasterMemoryFlags.Conventional,
- Image.Width,
- Image.Height,
- Image.BitsPerPixel,
- Image.Order,
- Image.ViewPerspective,
- Image.GetPalette(),
- IntPtr.Zero,
- 0);
- byte[] Data;
-
- //改变背景与圆圈颜色
- // 判断图像是否为24bit图像
- if (Image.BitsPerPixel == 24)
- {
- Image.Access();
- //遍历图像上每一点像素
- for (int i = 0; i < Image.Height; i++)
- {
- for (int j = 0; j < Image.Width; j++)
- {
- Data = Image.GetPixelData(i, j);
- //若该店像素值三个分量均为0则说明是黑色,将该点像素值三个分量均变为255(白色)
- if (Data[0] == 0 && Data[1] == 0 && Data[2] == 0)
- {
- Data[0] = 255;
- Data[1] = 255;
- Data[2] = 255;
- }
- else //if(Data[0] ==255 && Data[1] ==255 && Data[2] == 255)
- {
- Data[0] = 0;
- Data[1] = 0;
- Data[2] = 0;
- }
- //将新像素值赋予图像
- destImage.SetPixelData(i, j, Data);
- }
- }
- }
- //显示图像
- theViewer2.Image = destImage;
复制代码 关于RasterImage 的详细信息,大家可以参照官网文档,可在文档中直接搜索RasterImage.
6. 生成解决方案,并运行程序。显示结果如下: 在成功地操作了图像的像素之后,也可以通过该方法将RGB图像转换成灰度图像。灰度图像即将RGB图像上某一点像素值的R,G,B分量按照一定的权重计算出一个新的值,将该值分别赋予R,G,B 三个分量。也就是说灰度图像的每一个像素虽然也有三个分量,但每一个分量的值是相同的。具体操作如下: 1. 将之前button2.click()事件中改变图像背景圆圈颜色之后的代码替换如下:
- //彩色图像转灰度图像
- //遍历图像每一个像素
- byte pixel;
- for (int i = 0; i < Image.Height; i++)
- {
- for (int j = 0; j < Image.Width; j++)
- {
- Data = Image.GetPixelData(i, j);
- //按权重重新计算像素值
- pixel = (byte)(0.3 * Data[0] + 0.59 * Data[1] + 0.11 * Data[2]);
- Data[0] = pixel;
- Data[1] = pixel;
- Data[2] = pixel;
-
- destImage.SetPixelData(i, j, Data);
- }
- }
- //显示图像
- theViewer2.Image = destImage;
复制代码
2. 生成解决方案,并运行程序,显示结果下: 对于图像像素的操作就简单介绍到这里,以上内容说的有什么问题的还希望大家给予指出。感谢大家的支持。 以下是程序的demo:
|