C#中将byte数组转换为8bit灰度图像

C#中将byte数组转换为8bit灰度图像
C#中将byte数组转换为8bit灰度图像

16int stride = bmpData.Stride;//扫描线的宽度

17int offset = stride - width;//显示宽度与扫描线宽度的间隙

18IntPtr iptr = bmpData.Scan0;//获取bmpData的内存起始位置

19int scanBytes = stride * height;//用stride宽度,表示这是内存区域的大小

20

21////下面把原始的显示大小字节数组转换为内存中实际存放的字节数组

22int posScan = 0, posReal = 0;//分别设置两个位置指针,指向源数组和目标数组

23byte[] pixelValues = new byte[scanBytes];//为目标数组分配内存

24

25for (int x = 0; x < height; x )

26{

27////下面的循环节是模拟行扫描28for (int y = 0; y < width; y )29{

30pixelValues[posScan ] =rawValues[posReal ];

31}

32posScan = offset;//行扫描结束,要将目标位置指针移过那段“间隙”

33}

34

35////用Marshal的Copy方法,将刚才得到的内存字节数组复制到BitmapData中

36

System.Runtime.InteropServices.Marshal.Copy(pixelValues, 0, iptr,scanBytes); 37bmp.UnlockBits(bmpData);//解锁内存区域38

39////下面的代码是为了修改生成位图的索引表,从伪彩修改为灰度

40ColorPalette tempPalette;

41using (Bitmap tempBmp = new Bitmap(1, 1,PixelFormat.Format8bppIndexed)) 42{

43tempPalette = tempBmp.Palette;44}

45for (int i = 0; i < 256; i )

46

47

Color.FromArgb(i, i, i);

48

49

50

51

52

53{

tempPalette.Entries[i] =}bmp.Palette = tempPalette;

////算法到此结束,返回结果

return bmp;

54}

图像灰度变换实验报告

图像灰度变换报告 一.实验目的 1.学会使用Matlab ; 2.学会用Matlab 软件对图像进行灰度变换,观察采用各种不同灰度变换发法对最终图像效果的影响; 二.实验内容 1.熟悉Matlab 中的一些常用处理函数 读取图像:img=imread('filename'); //支持TIF,JPEG,GIF,BMP,PNG 等文件格式。 显示图像:imshow(img,G); //G 表示显示该图像的灰度级数,如省略则默认为256。 保存图片:imwrite(img,'filename'); //不支持GIF 格式,其他与imread 相同。 亮度变换:imadjust(img,[low_in,high_in],[low_out,high_out]); //将low_in 至high_in 之间的值映射到low_out 至high_out 之 间,low_in 以下及high_in 以上归零。 绘制直方图:imhist(img); 直方图均衡化:histeq(img,newlevel); //newlevel 表示输出图像指定的灰度级数。 2.获取实验用图像:rice.jpg. 使用imread 函数将图像读入Matlab 。 3 .产生灰度变换函数T1,使得: 0.3r r < 0.35 s = 0.105 + 2.6333(r – 0.35) 0.35 ≤ r ≤ 0.65 1 + 0.3(r – 1) r > 0.65 用T1对原图像rice.jpg 进行处理,使用imwrite 函数保存处理后的新图像。 4.产生灰度变换函数T2,使得: s = 5.用T2imwrite 保存处理后的新图像。 6.分别用 s = r 0.6; s = r 0.4; s = r 0.3 对kids.tiff 图像进行处理。为简便起见,使用Matlab 中的imadjust 函数,最后用imwrite 保存处理后的新图像。 7.对circuit.jpg 图像实施反变换(Negative Transformation )。s =1-r; 使

图片与字节数组相互转换的方法

图片与字节数组相互转换的方法 图片与字节数组相互转换的方法 aspx.cs   using System;using System.IO; using System.Drawing; using System.Drawing.Imaging;public partial class _2Stream : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) {}protected void FileToStream(object sender, EventArgs e) { //将JPG图片转化成字节数组 Image image = Image.FromFile("E:/1.jpg"); //或者使用Server.MapPath MemoryStream ms =

new MemoryStream(); image.Save(ms, ImageFormat.Jpeg); ms.Flush(); ms.Seek(0, SeekOrigin.Begin); byte[] buffer = new byte[ms.Length]; ms.Read(buffer, 0, (int)ms.Length);//遍历字节数组 for (int i = 0; i < buffer.LongLength; i++) { message.Text += buffer[i].ToString(); }//将字节数组转化成图像文件(自定义格式)并保存MemoryStream ms2 = new MemoryStream(buffer, 0, buffer.Length); ms2.Seek(0, SeekOrigin.Begin); Image image2 = Image.FromStream(ms2); image2.Save("E:\\2.gif", ImageFormat.Gif);

matlab图像处理图像灰度变换直方图变换

附录1 课程实验报告格式 每个实验项目包括:1)设计思路,2)程序代码,3)实验结果,4)实验中出现的问题及解决方法。 实验一:直方图灰度变换 A:读入灰度图像‘debye1.tif’,采用交互式操作,用improfile绘制一条线段的灰度值。 imread('rice.tif'); imshow('rice.tif'),title('rice.tif'); improfile,title('主对角线上灰度值')

B:读入RGB图像‘flowers.tif’,显示所选线段上红、绿、蓝颜色分量的分布imread('flowers.tif'); imshow('flowers.tif'),title('flowers.tif'); improfile,title('主对角线红绿蓝分量') C:图像灰度变化 f=imread('rice.png'); imhist(f,256); %显示其直方图 g1=imadjust(f,[0 1],[1 0]); %灰度转换,实现明暗转换(负片图像) figure,imshow(g1)%将0.5到0.75的灰度级扩展到范围[0 1] g2=imadjust(f,[0.5 0.75],[0 1]); figure,imshow(g2) 图像灰度变换处理实例: g=imread('me.jpg'); imshow(g),title('原始图片'); h=log(1+double(g)); %对输入图像对数映射变换 h=mat2gray(h); %将矩阵h转换为灰度图片

h=im2uint8(h); %将灰度图转换为8位图 imshow(h),title('转换后的8位图'); 运行后的结果: 实验二:直方图变换 A:直方图显示 I=imread('cameraman.tif'); %读取图像 subplot(1,2,1),imshow(I) %输出图像 title('原始图像') %在原始图像中加标题 subplot(1,2,2),imhist(I) %输出原图直方图 title('原始图像直方图') %在原图直方图上加标题运行结果如下:

java整型数与网络字节序的 byte[] 数组转换关系

java整型数与网络字节序的byte[] 数组转换关系 工作项目需要在java和c/c++之间进行socket通信,socket通信是以字节流或者字节包进行的,socket发送方须将数据转换为字节流或者字节包,而接收方则将字节流和字节包再转换回相应的数据类型。如果发送方和接收方都是同种语言,则一般只涉及到字节序的调整。而对于java和c/c++的通信,则情况就要复杂一些,主要是因为java中没有unsigned类型,并且java和c在某些数据类型上的长度不一致。 本文就是针对这种情况,整理了java数据类型和网络字节流或字节包(相当于java的byte 数组)之间转换方法。实际上网上这方面的资料不少,但往往不全,甚至有些有错误,于是就花了点时间对java整型数和网络字节序的byte[]之间转换的各种情况做了一些验证和整理。整理出来的函数如下: public class ByteConvert { // 以下是整型数和网络字节序的byte[] 数组之间的转换 public static byte[] longToBytes(long n) { byte[] b = new byte[8]; b[7] = (byte) (n & 0xff); b[6] = (byte) (n >> 8 & 0xff); b[5] = (byte) (n >> 16 & 0xff); b[4] = (byte) (n >> 24 & 0xff); b[3] = (byte) (n >> 32 & 0xff); b[2] = (byte) (n >> 40 & 0xff); b[1] = (byte) (n >> 48 & 0xff); b[0] = (byte) (n >> 56 & 0xff); return b; } public static void longT oBytes( long n, byte[] array, int offset ){ array[7+offset] = (byte) (n & 0xff); array[6+offset] = (byte) (n >> 8 & 0xff); array[5+offset] = (byte) (n >> 16 & 0xff); array[4+offset] = (byte) (n >> 24 & 0xff); array[3+offset] = (byte) (n >> 32 & 0xff); array[2+offset] = (byte) (n >> 40 & 0xff); array[1+offset] = (byte) (n >> 48 & 0xff); array[0+offset] = (byte) (n >> 56 & 0xff); } public static long bytesToLong( byte[] array ) { return ((((long) array[ 0] & 0xff) << 56) | (((long) array[ 1] & 0xff) << 48)

图像空域增强算法设计——灰度变换增强

成绩评定表

课程设计任务书

摘要 空域增强在数字图像处理中起到对图像灰度的拉伸、压缩变换的作用,目前这种方法在处理图像灰度值方面得到广泛的运用。MATLAB这种语言可移植性好、可扩展性强,再加上其中有丰富的图像处理函数,所以利用MATLAB软件来对图像进行空域增强在数字图像处理的应用中具有很大的优势。 图像变换增强是利用一系列的变换方法使图像的对比度得到提升,也就达到了增强图像的目的--更便于观察,更容易区分不同灰度的图像。根据函数的性质,灰度变换的方法有线性灰度变换、分段线性灰度变换、非线性灰度变换。对于灰度局限在某一个很小范围内的数字图像,如果用线性函数对图像的每一个像素进行线性扩展,扩大像素的对比度,将有效地改善视觉效果。本文利用MATLAB软件对灰度图像分别进行了线性灰度变换增强,非线性灰度增强和分段线性灰度增强,达到了提高图像对比度,增强图像效果的目的,证明了图像变换增强在数字图像处理中的重要作用。 关键词:MATLAB;灰度图像;线性变换;非线性变换

目录 1设计目的 (1) 2设计方案 (1) 2.1 灰度变换增强的概念 (1) 2.2 灰度变换增强流程 (2) 3设计内容 (3) 3. 1 线性灰度变换的概述 (3) 3. 2 分段线性灰度变换的概述 (3) 3. 3非线性灰度变换的概述 (4) 4程序代码设计 (5) 4.1线性灰度变换增强 (5) 4.1.1线性变换增强流程 (5) 4.1.2线性变换增强设计 (5) 4.2分段线性灰度变换程序代码 (6) 4.2.1分段线性变换增强流程 (6) 4.2.2分段线性变换增强设计 (6) 4.3非线性灰度变换程序代码 (8) 4.3.1非线性变换增强流程 (8) 4.3.2非线性变换增强设计 (8) 5仿真结果与分析 (10) 5.1线性灰度变换仿真结果 (10) 5.2分段线性灰度变换仿真结果 (11) 5.3非线性灰度变换仿真结果 (12) 5.4结果分析 (12) 结论 (14) 参考文献 (15)

实验一Matlab图像处理基础及图像灰度变换

实验一Matlab图像处理基础及图像灰度变换 一、实验目的 了解Matlab平台下的图像编程环境,熟悉Matlab中的DIP (Digital Image Processing)工具箱;掌握Matlab中图像的表示方法,图像类型、数据类型的种类及各自的特点,并知道怎样在它们之间进行转换。掌握Matlab环境下的一些最基本的图像处理操作,如读图像、写图像、查看图像信息和格式、尺寸和灰度的伸缩等等;通过实验掌握图像直方图的描绘方法,加深直方图形状与图像特征间关系间的理解;加深对直方图均衡算法的理解。 二、实验内容 1.从硬盘中读取一幅灰度图像; 2.显示图像信息,查看图像格式、大小、位深等内容; 3.用灰度面积法编写求图像方图的Matlab程序,并画图; 4.把第3步的结果与直接用Matlab工具箱中函数histogram的结果进行比较,以衡量第3步中程序的正确性。 5.对读入的图像进行直方图均衡化,画出处理后的直方图,并比较处理前后图像效果的变化。 三、知识要点 1.Matlab6.5支持的图像图形格式 TIFF, JEPG, GIF, BMP, PNG, XWD (X Window Dump),其中GIF不支持写。 2.与图像处理相关的最基本函数 读:imread; 写:imwrite; 显示:imshow; 信息查看:imfinfo; 3.Matlab6.5支持的数据类 double, unit8, int8, uint16, int16, uint32, int32, single, char (2 bytes per element), logical. 4.Matlab6.5支持的图像类型 Intensity images, binary images, indexed images, RGB image 5.数据类及图像类型间的基本转换函数 数据类转换:B = data_class_name(A);

C#数组、字节数组、转换等

C#数组、字节数组、转换等 在System名称空间里面有许多跟Array操作相关的类。其中System.Array 类里面就提供了以下常用的方法: BinarySearch: 使用二进制搜索算法在一维的排序Array中搜索值。 Copy: 将一个Array的一部分元素复制到另一个Array中,并根据需要执行类型强制转换和装箱。 CopyTo: 将当前一维Array的所有元素复制到指定的一维Array中。 Resize: 将数组的大小更改为指定的新大小。 Sort: 对一维Array对象中的元素进行排序。 与大多数类不同,Array提供CreateInstance方法,以便允许后期绑定访问,而不是提供公共构造函数。 Array.Copy方法不仅可在同一类型的数组之间复制元素,而且可在不同类型的标准数组之间复制元素;它会自动处理强制类型转换。有些方法,如CreateInstance、Copy、CopyTo、GetValue和SetValue,提供重载(接受64位整数作为参数),以适应大容量数组。LongLength和GetLongLength返回指示数组长度的64位整数。在执行需要对Array进行排序的操作(如BinarySearch)之前,必须对Array进行排序。

ArrayList跟Array不同,前者是集合对象,ArrayList的ToArray方法可以直接将ArrayList里面的全部元素导出到一个数组里,而不需用循环逐个元素地复制到一个数组。 ToArray的使用方法如下: ArrayList ay = new ArrayList(); ay.Add("sheep"); ay.Add("cat"); ay.Add("dog"); string[] al= (string[])ay.ToArray(typeof(string)); Console.WriteLine(al[0]); 关键的地方在于ToArray的参数,这里应该用反射中的typeof获取arraylist 里面元素的原始数据类型。 在数组中有一种比较特殊的: 字节数组,即byte[]。内存、文件中的数据都是以字节数组的形式储存的,如果程序需要对数据进行操作的话,或多或少都会使用到byte[]。 对于byte[]跟其他类型的相互转换问题,在C++中,使用Memorycopy函数即可完成,虽然在C#里面也有类似MemoryCopy的函数: Buffer.BlockCopy,但由于强类型的特性,在C#里它并实现不了字节数组跟其他类型转换的功能。 为了解决这个问题,需要手工写将其他类型的数据通过位运算和逻辑运算而得到字节数组。如下面的代码: //整型转换为字节数组 int i = ; //对应的十六进制是:0012D687

byte数组转化成16进制字符串用法分析

byte数组转化成16进制字符串,C#中的overload,overwrite,override的区别 C++ 实现Single Sever Simulation AFNetworking 更改请求时间iOS chrome插件,二维码自动生成,C编程方式进行控制台输入 maven jar shade assembly配置[XML] Maven pom.xml public: double angle; QPen ang_info_pen; }; #endif [文件] MainWindow.cpp ~ 28KB [文件] MainWindow.h ~ 3KB //AngularJS 绑定鼠标左键、右键单击事件 //API权限设计总结系统sign验证规则 //Apriopri算法的简单实现 #ifndef __MAINWINDOW_H__ #define __MAINWINDOW_H__ #include "ui_MainWindow.h" #include "Shape.h" #include class CDockWin; class CDrawWin:public QMainWindow, public Ui_Mainwin { Q_OBJECT public: CDrawWin(QWidget *parent = NULL); // 画图状态定义 enum DRAW_STATUS{ // 无画图状态 DRAW_STATUS_NONE = 0, // 绘画当中 DRAW_STATUS_DRAWING, // 移动 DRAW_STATUS_DRAG, // 改变图元 DRAW_STATUS_CHANGE }; // 当前的菜单选择 enum MENU_STATUS{

实验三 图像增强--灰度变换

实验三图像增强—灰度变换 一、实验目的: 1、了解图像增强的目的及意义,加深对图像增强的感性认识,巩固所学理论知识。 2、学会对图像直方图的分析。 3、掌握直接灰度变换的图像增强方法。 二、实验原理及知识点 术语‘空间域’指的是图像平面本身,在空间域内处理图像的方法是直接对图像的像素进行处理。空间域处理方法分为两种:灰度级变换、空间滤波。空间域技术直接对像素进行操作其表达式为: g(x,y)=T[f(x,y)] 其中f(x,y)为输入图像,g(x,y)为输出图像,T是对图像f进行处理的操作符,定义在点(x,y)的指定领域内。 定义点(x,y)的空间邻近区域的主要方法是,使用中心位于(x,y)的正方形或长方形区域。此区域的中心从原点(如左上角)开始逐像素点移动,在移动的同时,该区域会包含不同的领域。T应用于每个位置(x,y),以便在该位置得到输出图像g。在计算(x,y)处的g值时,只使用该领域的像素。 灰度变换T的最简单形式是使用领域大小为1×1,此时,(x,y)处的g值仅由f在该点处的亮度决定,T也变为一个亮度或灰度级变化函数。当处理单设(灰度)图像时,这两个术语可以互换。由于亮度变换函数仅取决于亮度的值,而与(x,y)无关,所以亮度函数通常可写做如下所示的简单形式: s=T(r) 其中,r表示图像f中相应点(x,y)的亮度,s表示图像g中相应点(x,y)的亮度。 核心函数是imhist,其基本语法为: h=imhist(f,b) 其中,f为输入图像,h为其直方图h(),b是用于形成直方图像的灰度级的个数。如果b未包含在此变量中,则默认值为256.如要处理一幅uint8

用matlab实现图像灰度变换课程设计

课程设计报告册 课程名称: MATLAB课程设计 课题名称:灰度变换增强 专业班级: 姓名: Bob Wang 学号: 15164 课程设计主要场所:信息楼220 时间: 指导教师:成绩:

前言 数字图像处理技术是20世界60年代发展起来的一门新兴学科,随着图像处理理论和方法的进一步完善,使得数字图像处理技术在各个领域得到了广泛应用,并显示出广阔的应用前景。MATLAB既是一种直观、高效的计算机语言,同时又是一个科学计算平台。它为数据分析和数据可视化、算法和应用程序开发提供了最核心的数学和高级图形工具。根据它提供的500多个数学和工程函数,工程技术人员和科学工作者可以在它的集成环境中交互或变成以完成各自的计算。MATLAB中集成了功能强大的图像处理工具箱。由于MATLAB语言的语法特征与C语言极为相似,而且更加简单,更加符合科技人员对数学表达式的书写格式,而且这种语言可移植性好、可扩展性强,再加上其中有丰富的图像处理函数,所以MATLAB在图像处理的应用中具有很大的优势。 MATLAB是一种以矩阵运算为基础的交互式程序语言,能够满足科学、工程计算和绘图的要求,与其它计算机语言相比,其特点是简洁和智能化,适应科技专业人员的思维方式和书写习惯,使得编程和调试效率大大提高。我们学习掌握MATLAB,也可以说是在科学工具上与国际接轨。

目录 一、课程设计目的 (2) 二、设计任务及容 (2) 三、课题设计实验条件 (3) 四、涉及知识 (3) 五、具体设计过程及调试 (4) 5.1、图像的读入和显示 5.1.1、打开图像 (4) 5.1.2、显示原图像 (5) 5.1.3、图像灰度处理 (7) 5.1.4、显示灰阶后图像 (8) 5.2、直方图均衡化 5.2.1、生成直方图 (10) 5.2.2、直方图均衡化 (12) 5.3、灰度变换 5.3.1、线性变换 (9) 5.3.2、分段线性变换 (9) 5.3.3、非线性变换.................................... (9) 六、心得体会 (17) 七、参考文献 (18) 八、程序清单 (19)

字符串和字符数组之间的转换

字符串和字符数组之间的转换 2010-11-02 16:53:00| 分类: |举报|字号订阅 字符串类提供了一个void ToCharArray() 方法,该方法可以实现字符串到字符数组的转换。如下例: private void TestStringChars() { string str = "mytest"; char[] chars = (); = ""; "Length of \"mytest\" is " + + "\n"); "Length of char array is " + + "\n"); "char[2] = " + chars[2] + "\n"); } 例中以对转换转换到的字符数组长度和它的一个元素进行了测试,结果如下: Length of "mytest" is 6 Length of char array is 6 char[2] = t 可以看出,结果完全正确,这说明转换成功。那么反过来,要把字符数组转换成字符串又该如何呢? 我们可以使用类的构造函数来解决这个问题。类有两个构造函数是通过字符数组来构造的,即 String(char[]) 和String[char[], int, int)。后者之所以多两个参数,是因为可以指定用字符数组中的哪一部分来构造字符串。而前者则是用字符数组的全部元素来构造字符串。我们以前者为例, 在 TestStringChars() 函数中输入如下语句: char[] tcs = {'t', 'e', 's', 't', ' ', 'm', 'e'}; string tstr = new String(tcs); "tstr = \"" + tstr + "\"\n"); 运行结果输入 tstr = "test me",测试说明转换成功。 实际上,我们在很多时候需要把字符串转换成字符数组只是为了得到该字符串中的某个字符。如果只是为了这个目的,那大可不必兴师动众的去进行转换,我们

图像灰度变换增强

图像灰度变换增强 摘要:灰度变换是基于点操作的增强方法,它将每一个像素的灰度值按照一定的数学变换公式转换为一个新的灰度值,如增强处理中的对比度增强。对比度增强可以采用线性拉伸和非线性拉伸。线性拉伸可以将原始输入图像中的灰度值不加区别地扩展。如果要求对局部扩展拉伸某一范围的灰度值,或对不同范围的灰度值进行不同的拉伸处理时,采用分段线性拉伸。非线性拉伸常采用对数扩展和指数扩展。对数扩展拉伸低亮度去,压缩高亮度区;指数扩展拉伸了高亮区,压缩了低亮度区。 关键词:图像增强,灰度变换,线性变换,分段线性变换,非线性变换 一. 概述 影响系统图像清晰程度的因素很多,例如室外光照度不够均匀就会造成图像灰度过于集中;由CCD (摄像头)获得的图像经过A/D (数/模转换,该功能在图像系统中由数字采集卡来实现)转换、线路传送都会产生噪声污染等等。因此图像质量不可避免的降低了,轻者表现为图像不干净,难于看清细节;重者表现为图像模糊不清,连概貌也看不出来。因此,在对图像进行分析之前,必须要对图像质量进行改善,一般情况下改善的方法有两类:图像增强和图像复原。图像增强不考虑图像质量下降的原因,只将图像中感兴趣的特征有选择的突出,而衰减不需要的特征,它的目的主要是提高图像的可懂度。图像复原技术与增强技术不同,它需要了解图像质量下降的原因,首先要建立"降质模型",再利用该模型,恢复原始图像。 根据图像增强处理过程所在的空间不同,图像增强可分为空余增强法和频域增强法两大类。频域增强是在图像的某种变换域内,对图像的变换系数值进行运算,即作某种修正,然后通过逆变换获得增强了的图像。空域增强则是指直接在图像所在的二维空间进行增强处理,既增强构成图像的像素。空域增强法主要有灰度变换增强,直方图增强,图像平滑和图像锐化等。 图像的灰度变换处理是图像增强处理技术中一种非常基础,直接的空间域图像处理法,也是图像数字化软件和图像显示软件的一个重要组成部分。灰度变换是指根据某种目标条件按一定变换关系逐点改变原图像中每一个像素灰度值的方法。目的是为了改善画质,使图像的显示效果更加清晰。 二. 灰度变换处理 灰度变换的过程可表示为:)],([),(y x f T y x g ,它是指将输入图像中每个像素

inputStream和String,Byte之间的转换

1.import java.io.ByteArrayInputStream; 2.import java.io.ByteArrayOutputStream; 3.import java.io.IOException; 4.import java.io.InputStream; 5. 6./** 7. * 8. * @author Andy.Chen 9. * @mail Chenjunjun.ZJ@https://www.360docs.net/doc/bc6770367.html, 10. * 11. */ 12.public class InputStreamUtils { 13. 14. final static int BUFFER_SIZE = 4096; 15. 16. /** 17. * 将InputStream转换成String 18. * @param in InputStream 19. * @return String 20. * @throws Exception 21. * 22. */ 23. public static String InputStreamTOString(InputStream in) throws Ex ception{ 24. 25. ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 26. byte[] data = new byte[BUFFER_SIZE]; 27. int count = -1; 28. while((count = in.read(data,0,BUFFER_SIZE)) != -1) 29. outStream.write(data, 0, count); 30. 31.data = null; 32. return new String(outStream.toByteArray(),"ISO-8859-1"); 33. } 34. 35. /** 36. * 将InputStream转换成某种字符编码的String 37. * @param in 38. * @param encoding 39. * @return 40. * @throws Exception 41. */

图像处理灰度变换实验

一. 实验名称:空间图像增强(一) 一.实验目的 1.熟悉和掌握利用matlab工具进行数字图像的读、写、显示、像素处理等数字图像处理的基本步骤和流程。 2.熟练掌握各种空间域图像增强的基本原理及方法。 3.熟悉通过灰度变换方式进行图像增强的基本原理、方法和实现。 4.熟悉直方图均衡化的基本原理、方法和实现。 二.实验原理 (一)数字图像的灰度变换 灰度变换是图像增强的一种经典而有效的方法。灰度变换的原理是将图像的每一个像素的灰度值通过一个函数,对应到另一个灰度值上去从而实现灰度的变换。常见的灰度变换有线性灰度变换和非线性灰度变换,其中非线性灰度变换包括对数变换和幂律(伽马)变换等。 1、线性灰度变换 1)当图像成像过程曝光不足或过度,或由于成像设备的非线性和图像记录设备动态范围太窄等因素,都会产生对比度不足的弊病,使图像中的细节分辨不清,图像缺少层次。这时,可将灰度范围进行线性的扩展或压缩,这种处理过程被称为图像的线性灰度变换。对灰度图像进行线性灰度变换能将输入图像的灰度值的动态范围按线性关系公式拉伸扩展至指定范围或整个动态范围。 2)令原图像f(x,y)的灰度范围为[a,b],线性变换后得到图像g(x,y),其灰度范围为[c,d],则线性灰度变换公式可表示为

a y x f b y x f a b y x f c c a y x f a b c d d y x g <≤≤>?????+---=),(),(),(, ,]),([,),( (1) 由(1)式可知,对于介于原图像f (x,y )的最大和最小灰度值之间的灰度值,可通过线性变换公式,一一对应到灰度范围[c,d]之间,其斜率为(d-c)/(b-a);对于小于原图像的最小灰度值或大于原图像的最大灰度值的灰度值,令其分别恒等于变换后的最小和最大灰度值。变换示意图如图1所示。 图1 线性灰度变换示意图 当斜率大于一时,变换后的灰度值范围得到拉伸,图像对比度得到提高;当斜率小于一时,变换后的灰度值范围被压缩,最小与最大灰度值的差变小,图像对比度降低;当斜率等于一时,相当于对图像不做变换。 3)由上述性质可知,线性灰度变换能选择性地加强或降低特定灰度值范围内的对比度,故线性灰度变换同样也可做分段处理:对于有价值的灰度范围,将斜率调整为大于一,用于图像细节;对于不重要的灰度范围,将图像压缩,降低对比度,减轻无用信息的干扰。最常用的分段线性变换的方法是分三段进行线性变换。 在原图像灰度值的最大值和最小值之间设置两个拐点,在拐点处,原图像的灰度值分别为r 1,r 2,该拐点对应的变换后的图像的灰度值分别为s 1,s 2,另外,取原图像灰度的最小值为r 0,最大值为r m ,对应的变换后的灰度值分别为s 0,s m 。

short,int,long与byte数组之间的转换

1. 2.package com.test; 3. 4.import java.nio.ByteBuffer; 5. 6.public class ByteUtil { 7. 8./** 9. * @param args 10. */ 11. public static void main(String[] args) { 12. test2(); 13. } 14. public static void test2() 15. { 16. short s = -20; 17. byte[] b = new byte[2]; 18. putReverseBytesShort(b, s, 0); 19. ByteBuffer buf = ByteBuffer.allocate(2); 20. buf.put(b); 21. buf.flip(); 22. System.out.println(getReverseBytesShort(b, 0)); 23. System.out.println(Short.reverseBytes(buf.getShort())); 24. System.out.println("***************************"); 25. int i = -40; 26. b = new byte[4]; 27. putReverseBytesInt(b, i, 0); 28. buf = ByteBuffer.allocate(4); 29. buf.put(b); 30. buf.flip(); 31. System.out.println(getReverseBytesInt(b, 0)); 32. System.out.println(Integer.reverseBytes(buf.getInt())); 33. System.out.println("***************************"); 34. long l = -50; 35. b = new byte[8]; 36. putReverseBytesLong(b, l, 0); 37. buf = ByteBuffer.allocate(8); 38. buf.put(b); 39. buf.flip(); 40. System.out.println(getReverseBytesLong(b, 0)); 41. System.out.println(Long.reverseBytes(buf.getLong())); 42. System.out.println("***************************"); 43. } 44. public static void test1()

JAVA二进制字节数组字符十六进制BCD编码转换

JAVA二进制字节数组字符十六进制BCD编码转换; import java.io.*; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class DataConverter { /* 把16进制字符串转换成字节数组 * @param hex * @return */ public static byte[] hexStringToByte(String hex) { int len = (hex.length() / 2); byte[] result = new byte[len]; char[] achar = hex.toCharArray(); for (int i = 0; i < len; i++) { int pos = i * 2; result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1])); } return result; } private static byte toByte(char c) { byte b = (byte) "0123456789ABCDEF".indexOf(c); return b; } /** *//** * 把字节数组转换成16进制字符串 * @param bArray * @return */ public static final String bytesToHexString(byte[] bArray) { StringBuffer sb = new StringBuffer(bArray.length); String sTemp; for (int i = 0; i < bArray.length; i++) { sTemp = Integer.toHexString(0xFF & bArray[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); }

JAVA里面关于byte数组和String之间的转换问题

JAVA里面关于byte数组和String之间的转换问题把byte转化成string,必须经过编码。 例如下面一个例子: import java.io.UnsupportedEncodingException; public class test{ public static void main(String g[]) { String s = "12345abcd"; byte b[] = s.getBytes(); String t = b.toString(); System.out.println(t); } } 输出字符串的结果和字符串s不一样了. 经过以下方式转码就可以正确转换了: public class test{ public static void main(String g[]) { String s = "12345abcd"; byte b[] = s.getBytes(); try { String t = new String(b); System.out.print(t); } catch (Exception e) { e.printStackTrace(); } } } String str = "String"; byte[] byte1 = str.getBytes(); String str1 = new String(byte1); byte[] byte2 = str1.getBytes(); String str2 = new String(byte2); System.out.println("str<<<" + str); System.out.println("byte1<<<" + byte1); System.out.println("str1<<<" + str1); System.out.println("byte2<<<" + byte2); System.out.println("str2<<<" + str2); ------------------------------------- 输出结果 str<<

数字图像处理实验一 图像的灰度变换

数字图像处理实验报告 (一) 班级:测控1002 姓名:刘宇 学号:06102043

实验一图像的灰度变换 1. 实验任务 熟悉MATLAB软件开发环境,掌握读、写图像的基本方法。 理解图像灰度变换在图像增强的作用,掌握图像的灰度线性变换和非线性变换方法。 掌握绘制灰度直方图的方法,掌握灰度直方图的灰度变换及均衡化的方法。2. 实验环境及开发工具 Windws2000/XP MATLAB 7.x 3. 实验原理 灰度变换 灰度变换是图像增强的一种重要手段,它常用于改变图象的灰度范围及分布,是图象数字化及图象显示的重要工具。在实际应用中,为了突出图像中感兴趣的研究对象,常常要求局部扩展拉伸某一范围的灰度值,或对不同范围的灰度值进行不同的拉伸处理,即分段线性拉伸: 图1.1 不同的分段线性变换 其对应的数学表达式为:

直方图均衡化 灰度直方图的横坐标是灰度级,纵坐标是该灰度级出现的频度,它是图像最基本的统计特征。依据定义,在离散形式下,用rk 代表离散灰度级,用pr(rk)代表pr(r),并且有下式成立: n n r P k k r = )( 1,,2,1,010-=≤≤l k r k 式中:nk 为图像中出现rk 级灰度的像素数,n 是图像像素总数,而nk/n 即为频数。 直方图均衡化处理是以累积分布函数变换法为基础的直方图修正法。假定变换函数为 ω ωd p r T s r r )()(0 ?== (a) Lena 图像 (b) Lena 图像的直方图 图1.2 Lena 图像及直方图 当灰度级是离散值时,可用频数近似代替概率值,即 1 ,,1,010)(-=≤≤= l k r n n r p k k k r

C#中将byte数组转换为8bit灰度图像

类似的文章在网上可以看到不少,但多多少少都存在一些问题。这两天做实验室的项目用到这个功能,我从头把它整理了一遍。 在看代码之前,首先解释几个问题。 byte数组存放的是图像每个像素的灰度值,byte类型正好是从0~255,存放8bit灰度图像的时候,一个数组元素就是一个像素的灰度值。仅有这个数组还不足以恢复出原来的图像,还必须事先知道图像的长、宽值; 创建Bitmap类的时候必须指定PixelFormat为Format8bppIndexed,这样才最符合图像本身的特性; Bitmap类虽然提供了GetPixel()、SetPixel()这样的方法,但我们绝对不能用这两个方法来进行大规模的像素读写,因为它们的性能实在很囧; 托管代码中,能不用unsafe就尽量不用。在.NET 2.0中已经提供了BitmapData类及其LockBits()、UnLockBits()操作,能够安全地进行内存读写; 图像的width和它存储时的stride是不一样的。位图的扫描线宽度一定是4的倍数,因此图像在内存中的大小并不是它的显示大小; Format8bppIndexed类型的PixelFormat是索引格式,其调色板并不是灰度的而是伪彩,因此需要我们对其加以修改。 代码如下,解说写在注释里了: 1 ///

2 /// 将一个字节数组转换为8bit灰度位图 3 /// 4 /// 显示字节数组 5 /// 图像宽度 6 /// 图像高度 7 /// 位图 8 public static Bitmap ToGrayBitmap(byte[] rawValues, int width, int height) 9 { 10 //// 申请目标位图的变量,并将其内存区域锁定 11 Bitmap bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed); 12 BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, width, height), 13 ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed); 14 15 //// 获取图像参数

相关文档
最新文档