C#伪彩色处理

来源: http://zxlovenet.cnblogs.com  

伪彩色处理是指将灰度图像转换成彩色图象。因为人眼对于彩色的分辨能力远高于对灰度图像的分辨能力,所以将灰度图像转换成彩色可以提高人眼对图像细节的辨别能力。伪彩色并不能真实的反映图像像的彩色情况。

  效果图:

   

  强度分层法和灰度级-彩色变换法:

  (1)强度分层法是伪彩色处理技术中最简单的一种。

  在某个灰度级Li上设置一个平行于x-y平面的切割平面,切割平面下面的,即灰度级小于Li的像素分配给一种颜色,相应的切割平面上大于灰度级Li的像素分配给另一种颜色。这样切割结果可以分成两层的伪彩色。可以使用M个平面去切割,就会得到M个不同灰度级的区域,这样就是具有M种颜色的为彩色图像。这种方法虽然简单,但是视觉效果不理想。

  (2)灰度级-彩色变换法可以将灰度图像变为具有多种颜色渐变的连续彩色图像。

  主要就是将图像通过不同变换特性的红、绿、蓝3个变换器,然后将三个颜色通道的输出合成某种颜色。由于三种颜色变换的不同,使得不同大小灰度级可以合成不同的颜色。一组典型的变换传递函数如下图。

  

  这里面需要注意的地方,代码只能是处理JPG格式的灰度图像,因为JPG图像的颜色深度是24位表示(R,G,B),每像素由3个字节表示即可,然而PNG图像的颜色深度是32位表示(R,G,B,A)。

  下面的代码是测试代码,以处理24位深度的图像为例,同像素不同通道的颜色值要相同,组合表示出是具有一定灰度的颜色。在实际应用中需要修改下面的代码依据要处理的图像格式。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

#region 伪彩色图像处理

/// <summary>

/// 伪彩色图像处理

/// 博客园-初行 http://www.cnblogs.com/zxlovenet

/// 日期:2014.2.14

/// </summary>

/// <param name="bmp">传入的灰度图像</param>

/// <param name="method">使用何种方法,false强度分层法,true灰度级-彩色变换法</param>

/// <param name="seg">强度分层中的分层数</param>

/// <returns>返回伪彩色图像</returns>

private Bitmap gcTrans(Bitmap bmp, bool method, byte seg)

{

    if (bmp != null)

    {

        if (System.Drawing.Imaging.PixelFormat.Format24bppRgb == bmp.PixelFormat)

        {

            Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);

            System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);

            IntPtr ptr = bmpData.Scan0;

            int bytes = bmp.Width * bmp.Height * 3;

            byte[] grayValues = new byte[bytes];

            System.Runtime.InteropServices.Marshal.Copy(ptr, grayValues, 0, bytes);

            bmp.UnlockBits(bmpData);

            byte[] rgbValues = new byte[bytes];

            //清零

            Array.Clear(rgbValues, 0, bytes);

            byte tempB;

            if (method == false)

            {

                //强度分层法

                for (int i = 0; i < bytes; i += 3)

                {

                    byte ser = (byte)(256 / seg);

                    tempB = (byte)(grayValues[i] / ser);

                    //分配任意一种颜色

                    rgbValues[i + 1] = (byte)(tempB * ser);

                    rgbValues[i] = (byte)((seg - 1 - tempB) * ser);

                    rgbValues[i + 2] = 0;

                }

            }

            else

            {

                //灰度级-彩色变换法

                for (int i = 0; i < bytes; i += 3)

                {

                    if (grayValues[i] < 64)

                    {

                        rgbValues[i + 2] = 0;

                        rgbValues[i + 1] = (byte)(4 * grayValues[i]);

                        rgbValues[i] = 255;

                    }

                    else if (grayValues[i] < 128)

                    {

                        rgbValues[i + 2] = 0;

                        rgbValues[i + 1] = 255;

                        rgbValues[i] = (byte)(-4 * grayValues[i] + 2 * 255);

                    }

                    else if (grayValues[i] < 192)

                    {

                        rgbValues[i + 2] = (byte)(4 * grayValues[i] - 2 * 255);

                        rgbValues[i + 1] = 255;

                        rgbValues[i] = 0;

                    }

                    else

                    {

                        rgbValues[i + 2] = 255;

                        rgbValues[i + 1] = (byte)(-4 * grayValues[i] + 4 * 255);

                        rgbValues[i] = 0;

                    }

                }

            }

            bmp = new Bitmap(bmp.Width, bmp.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

            bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);

            ptr = bmpData.Scan0;

            System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);

            bmp.UnlockBits(bmpData);

            return bmp;

        }

        else

        {

            return null;

        }

    }

    else

    {

        return null;

    }

}

#endregion

  颜色映射:

  

  颜色映射的方法需要做一个颜色映射表,不同灰度级都会有对应的颜色。这个跟强度分层法相似,可以分成不同的层次,对应的颜色可以根据实际情况做映射。

  在实际应用中,热成像测温系统所产生的红外图像为黑白灰度级图像,灰度值动态范围不大,人眼很难从这些灰度级中获得丰富的信息。为了更直观地增强显示图像的层次,提高人眼分辨能力,对系统所摄取的图像进行伪彩色处理,从而达到图像增强的效果,使图像信息更加丰富。例如对受热物体所成的像进行伪彩色时,将灰度低的区域设置在蓝色附近(或蓝灰、黑等),而灰度级高的区域设置在红色附近(或棕红、白等),以方便人们对物体的观察。

  下面几张图片是在实际应用中的情况(图片来源网络):

 

  

   

时间: 2024-11-02 23:20:49

C#伪彩色处理的相关文章

灰度图转彩色图(伪彩色处理)

将8Bit灰度数据转化为Bgr24的彩色图像 8bit灰度数据:byte[] GrayValue    长度:width * height PixelFormat pixelFormat = PixelFormats.Bgr24; byte[] colorvalues = GrayToColor(GrayValue); ByteSize = Width * Height; IntPtr dataPtr = IntPtr.Zero; GCHandle _hObject = GCHandle.All

图片反转

图片反转: if (_srcBitmap != null) //_srcBitmap = (Bitmap)Image.FromFile(_curFileName) { _dstBitmap = (Bitmap)_srcBitmap.Clone(); BitmapData bmpData = _srcBitmap.LockBits(new Rectangle(0, 0, _srcBitmap.Width, _srcBitmap.Height),ImageLockMode.ReadWrite, _s

(转)opencv中image watch插件安装使用教程

原文地址:http://blog.csdn.net/u013088062/article/details/42710819 Image Watch(下载)是OpenCV的一款最新工具,它能够即时显示出矩阵的内容,即memory中Mat的信息,方便程序的调试,非常好用.不过目前该插件只支持VS2012,而且不能保存调试信息. 下载地址:点击打开链接 安装方法: 1 从以上网址下载插件,下载后得到一个ImageWatch.vsix. 2.打开VS2012安装目录,VS2012/COMMOM7/IDE

Matlab绘图基本控制命令

图形的控制与表现 (Figure control and representation) MATLAB提供的用于图形控制的函数和命令:   axis:  人工选择坐标轴尺寸.    clf:清图形窗口. ginput: 利用鼠标的十字准线输入.   hold: 保持图形.    shg:显示图形窗口.subplot: 将图形窗口分成N块子窗口.1.图形窗口(figure window)(1). 图形窗口的创建和选择(Creating and selecting of figure window)

彩色图像与灰度图像之间的转换

一.彩色图像简介 在RGB色彩空间,图像深度与色彩的映射关系主要有真彩色.伪彩色和调配色. 真彩色是指在组成一幅彩色图像的每个像素值中,有R,G,B三个基色分量,每个基色分量直接决定显示设备的基色强度,这样产生的彩色称为真彩色,是真实的原图彩色. 伪彩色图像的每个像素值实际上是一个索引值或代码,该代码值作为色彩查找表CLUT中某一项的入口地址,根据该地址可查找出包含实际R,G,B的强度值.这种用查找映射的方法产生的色彩称为伪彩色.色彩查找表CLUT是一个事先做好的表,表项入口地址也称为索引号.彩

利用 Python 练习数据挖掘

覆盖使用Python进行数据挖掘查找和描述数据结构模式的实践工具. 第一节 介绍 数据挖掘是一个隐式提取以前未知的潜在有用的数据信息提取方式.它使用广泛,并且是众多应用的技术基础. 本文介绍那些使用Python数据挖掘实践用于发现和描述结构模式数据的工具.近些年来,Python在开发以数据为中心的应用中被用的越来越多.感谢大型科学计算社区的支持以及大大丰富的数据分析函数库.尤其是,我们可以看到如何: ? 导入和可视化数据 ? 数据分类 ? 使用回归分析和相关测量法发现数据之间的关系 ? 数据降维

Framebuffer子系统【转】

本文转载自:http://blog.csdn.net/av_geek/article/details/40897115 本文将介绍Framebuffer子系统 目标平台:TQ2440 CPU:s3c2440 LCD设备:3.5英寸,分辨率320X240 1. 概述 Framebuffer,中文名字是帧缓冲,这个帧也就是一副图像所需要的数据.因此,帧缓冲其实就是LCD设备的驱动程序.Linux中,framebuffer子系统框架如下: 核心层的代码以fbmem.c为主,核心层包括许多与具体硬件无关

流媒体 3——彩色数字图像基础

1. 视觉系统的颜色感知 颜色是视觉系统对可见光的感知结果.可见光是波长在380 nm-780 nm之间的电磁波,我们看到的大多数光不是一种波长的光,而是由许多不同波长的光组合成的.(1).眼睛本质上是一个照相机.人的视网膜(human retina)通过神经元来感知外部世界的颜色,每个神经元或者是一个对颜色敏感的锥体(cone),或者是一个对颜色不敏感的杆状体(rod).(2).红.绿和蓝三种锥体细胞对不同频率的光的感知程度不同,对不同亮度的感知程度也不同,人们可以使用数字图像处理技术来降低数

2016年上半年网络管理员考试上午真题(1-25)

对于想参加下半年网络管理员考试的考生来说,2016年上半年网络管理员考试真题是宝贝,下面希赛软考学院为您整理了上午真题,供您参考学习. 2016年上半年网络管理员考试上午真题(1-25) ●在Windows系统中,若要将文件"D:\user\my.doc"设置成只读属性,可以通过修改该文件的()来实现.将文件设置为只读属性可控制用户对文件的修改,这一级安全管理称之为()安全管理. (1)A.属性 B.内容 C.文件名 D.路径名 (2)A.用户级 B.目录级 C.文件级 D.系统级 ●