找回密码
 立即注册

QQ登录

只需一步,快速开始

Marco

中级会员

6

主题

11

帖子

832

积分

中级会员

积分
832
Marco
中级会员   /  发表于:2016-9-22 16:13  /   查看:3288  /  回复:1
本帖最后由 Marco 于 2016-9-27 16:27 编辑

在前面的文章中,已经了解到LeadTools是如何加载与显示图像。这篇文章中,主要想和大家分享下LeadTools是如何获取图像的像素值,并对其加以操作的。提到图像的像素值,首先想在这里说明下图像的位深。我们经常说到8bit图像,也就是说一个像素是8bit, 只有一个值(0-255)。对于RGB图像来说,是一幅24bit图像,每一个像素上有三个值,分别是R,G,B三种颜色的分量。
LeadTools提供了如下这个函数用于获取图像上的像素值:
  1. Data=Image.GetPixelData(Row, Column);
复制代码
其中Data 是一个byte类型的数组,image是加载的图像,Row ,Column分别代表图像的行与列。即通过GetPixelData这个函数可以获取到图像上Row行,Column列这一点的像素值。如果图像是8bit图像则Data即为一个长度为1 的数组,如果图像是RGB图像,则Data是一个长度为3的数组,分别存放着RG,B三个颜色的分量。
同时,LeadTools也提供了改变图像上某点像素值的函数:
  1. Image.SetPixelData(Row, Column, Data)
复制代码
即将Image 图像上Row行,Column列这一点的像素值变成Data

关于这两个函数的具体使用情况可以参照官方文档,链接如下:https://www.leadtools.com/help/leadtools/v19/dh/to/webframe.html?platform=dotnet
具体在Image Features——Image Processing——Manipulating Bitmap Data.
在了解了这两个函数之后,我们便可对图像的像素值进行操作。如下图像所示,一张纯白的背景上有一个黑色的圆圈。下面这个demo实现的就是将背景变为黑色,圆圈变为白色。

这个Demo是在教程(一)的代码基础上继续改进的,所以之前的配置设置就不在这里详细描述。具体步骤如下:
1.  在Form1设计模式中,再添加一个button控件,ImageViewer控件分别改名为change,theViewer2.这样就有了两个按钮,两个显示控件。其中第一个按钮用于载入原始图片,显示原始图片。第二个按钮用于处理原始图片,显示处理之后的图片。
2.  切换到From1代码模式,在using之后,添加如下代码(添加之前还是要先添加引用,具体见教程一)。
  1. using Leadtools.ImageProcessing;
  2. using Leadtools.ImageProcessing.Core;
  3. using Leadtools.Drawing;
  4. using Leadtools.Dicom;
复制代码
3.  在Public Form1()中添加如下代码:
  1. RasterImageViewer theViewer2;
  2.             theViewer2 = new RasterImageViewer();
复制代码
4.  在public partial class Form1 : Form 这个类中,重新定义图形变量,并将教程一中button1.click()事件中的该变量删除
  1. RasterImage Image;
复制代码
5.  切换回到Form1设计页面,双击button2则代码页面会出现button2.click()事件,在该事件中添加如下代码:
  1.   //创建一个与image 大小,位深相同的图像在内存中用于存储处理之后的图像
  2.             RasterImage destImage = new RasterImage(
  3.                    RasterMemoryFlags.Conventional,
  4.                    Image.Width,
  5.                    Image.Height,
  6.                    Image.BitsPerPixel,
  7.                    Image.Order,
  8.                    Image.ViewPerspective,
  9.                    Image.GetPalette(),
  10.                    IntPtr.Zero,
  11.                    0);
  12.             byte[] Data;
  13.       
  14.             //改变背景与圆圈颜色
  15.            // 判断图像是否为24bit图像
  16.             if (Image.BitsPerPixel == 24)
  17.             {
  18.                 Image.Access();
  19.                 //遍历图像上每一点像素
  20.                 for (int i = 0; i < Image.Height; i++)
  21.                 {
  22.                     for (int j = 0; j < Image.Width; j++)
  23.                     {
  24.                         Data = Image.GetPixelData(i, j);
  25.                         //若该店像素值三个分量均为0则说明是黑色,将该点像素值三个分量均变为255(白色)
  26.                         if (Data[0] == 0 && Data[1] == 0 && Data[2] == 0)
  27.                         {
  28.                             Data[0] = 255;
  29.                             Data[1] = 255;
  30.                             Data[2] = 255;
  31.                         }
  32.                         else //if(Data[0] ==255 && Data[1] ==255 && Data[2] == 255)
  33.                         {
  34.                             Data[0] = 0;
  35.                             Data[1] = 0;
  36.                             Data[2] = 0;
  37.                         }
  38.                         //将新像素值赋予图像
  39.                         destImage.SetPixelData(i, j, Data);
  40.                     }

  41.                 }
  42.             }
  43.    //显示图像
  44.    theViewer2.Image = destImage;
复制代码
关于RasterImage 的详细信息,大家可以参照官网文档,可在文档中直接搜索RasterImage.


6.  生成解决方案,并运行程序。显示结果如下:
在成功地操作了图像的像素之后,也可以通过该方法将RGB图像转换成灰度图像。灰度图像即将RGB图像上某一点像素值的R,G,B分量按照一定的权重计算出一个新的值,将该值分别赋予R,G,B 三个分量。也就是说灰度图像的每一个像素虽然也有三个分量,但每一个分量的值是相同的。具体操作如下:
1.  将之前button2.click()事件中改变图像背景圆圈颜色之后的代码替换如下:

  1.             //彩色图像转灰度图像
  2.             //遍历图像每一个像素
  3.             byte pixel;
  4.             for (int i = 0; i < Image.Height; i++)
  5.             {
  6.                 for (int j = 0; j < Image.Width; j++)
  7.                 {

  8.                     Data = Image.GetPixelData(i, j);
  9.                     //按权重重新计算像素值
  10.                     pixel = (byte)(0.3 * Data[0] + 0.59 * Data[1] + 0.11 * Data[2]);
  11.                     Data[0] = pixel;
  12.                     Data[1] = pixel;
  13.                     Data[2] = pixel;
  14.                     
  15.                     destImage.SetPixelData(i, j, Data);
  16.                 }
  17.             }

  18.                   //显示图像
  19.                 theViewer2.Image = destImage;
复制代码


2.  生成解决方案,并运行程序,显示结果下:
对于图像像素的操作就简单介绍到这里,以上内容说的有什么问题的还希望大家给予指出。感谢大家的支持。
以下是程序的demo:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 1金币 +1000 收起 理由
gw0506 + 1000 很给力!

查看全部评分

1 个回复

倒序浏览
gw0506
超级版主   /  发表于:2016-9-22 18:00:26
沙发
啥也不说了,上金币!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部