文档库 最新最全的文档下载
当前位置:文档库 › 数字图像处理源码1

数字图像处理源码1

数字图像处理源码1
数字图像处理源码1

第一章 Windows位图和调色板

1.位图和调色板的概念

如今Windows(3.x以及95,NT)系列已经成为决大多数用户使用的操作系统。它比DOS 成功的一个重要因素是它可视化的漂亮界面,例如你可以在桌面上铺上你喜欢的墙纸。那么Windows是如何显示图象的呢?这就要谈到位图(Bitmap)。

我们知道,普通的显示器屏幕是由许许多多的点构成的,我们称之为象素。显示时采用扫描的方法:电子枪每次从左到右扫描一行,为每个象素着色,然后从上到下这样扫描若干行,就扫过了一屏。为了防止闪烁,每秒要重复上述过程几十次。例如我们常说的屏幕分辨率为640*480,刷新频率为70Hz,意思是说每行要扫描640个象素,一共有480行,每秒重复扫描屏幕70次。

我们称这种显示器为位映象设备。所谓位映象,就是指一个二维的象素矩阵,而位图就是采用位映象方法显示和存储的图象。举个例子,下图1是一幅普通的黑白位图,图2是被放大后的图,图中每个方格代表了一个象素,我们可以看到:整个骷髅就是由这样一些黑点和白点组成的。

图1. 骷髅

图2. 放大后的骷髅位图

那么,彩色图是怎么回事呢?

我们先来说说三元色RGB概念。

我们知道,自然界中的所有颜色都可以由红,绿,蓝(R,G,B)组合而成。有的颜色含有红色成分多一些,如深红;有的含有红色成分少一些,如淡红。针对含有红色成分的多少,可以分成0到255共256个等级,0级表示不含红色成分,255级表示含有100%的红色成分。同样,绿色和蓝色也被分成256级。这种分级的概念被称作量化。

这样,根据红,绿,蓝各种不同的组合我们就能表示出256*256*256,约1千6百万种颜色。这么多颜色对于我们人眼来已经足够了。

下表是常见的一些颜色的RGB组合值。

表1. 常见颜色的RGB组合

你大概已经明白了,当一幅图中每个象素赋予不同的RGB值时,就能呈现出五彩缤纷的颜色了,这样就形成了彩色图。对,是这样的,但实际上的做法还有些差别。

让我们来看看下面的例子。

有一个长宽各为200个象素,颜色数为16色的彩色图,每一个象素都用R,G,B三个分量表示,因为每个分量有256个级别,要用8位(bit),即一个字节(byte)来表示,所以每个象素需要用3个字节。整个图象要用200*200*3,约120k字节,可不是一个小数目呀!如果我们用下面的方法,就能省的多。

因为是一个16色图,也就是说这幅图中最多只有16种颜色,我们可以用一个表:表中的每一行记录一种颜色的R,G,B值。这样当我们表示一个象素的颜色时,只需要指出该颜色是在第几行,即该颜色在表中的索引值。举个例子,如果表的第0行为255,0,0(红色),那么当某个象素为红色时,只需要标明0即可。

让我们再来计算一下:16种状态可以用4位(bit)表示,所以一个象素要用半个字节。整个图象要用200*200*0.5,约20k字节,再加上表占用的字节为3*16=48字节.整个占用的字节数约为前面的1/6,省很多吧。

这张R,G,B的表,即是我们常说的调色板(Palette),另一种叫法是颜色查找表LUT(Look Up Table),似乎更确切一些。Windows位图中便用到了调色板技术.其实是不光是Windows 位图,许多图象文件格式如pcx,tif,gif等都用到了。所以很好地掌握调色板的概念是十分重要的.

有一种图,它的颜色数高达256*256*256种,也就是说包含我们上述提到的R,G,B 颜色表示方法中所有的颜色,这种图叫做真彩色图(True Color)。真彩色图并不是说一幅图包含了所有的颜色,而是说它具有显示所有颜色的能力,即最多可以包含所有的颜色。表示真彩色图时,每个象素直接用R,G,B三个分量字节表示,而不采用调色板技术,原因很明显:如果用调色板,表示一个象素也要用24位,这是因为每种颜色的索引要用24位(因为总共有2的24次方种颜色,即调色板有2的24次方行),和直接用R,G,B三个分量表示用的字节数一样,不但没有任何便宜,还要加上一个256*256*256*3个字节的大调色板。所以真彩色图直接用R,G,B三个分量表示,它又叫做24位色图。

2.Bmp文件格式

介绍完位图和调色板的概念,下面就让我们来看一看Windows的位图文件(.bmp文件)

的格式是什么样子的。

bmp文件大体上分成四个部分,如图3所示。

图3. Windows位图文件结构示意图

第一部分为位图文件头BITMAPFILEHEADER,是一个结构,其定义如下:

typedef struct tagBITMAPFILEHEADER {

WORD bfType;

DWORD bfSize;

WORD bfReserved1;

WORD bfReserved2;

DWORD bfOffBits;

} BITMAPFILEHEADER;

这个结构的长度是固定的,为14个字节(WORD为无符号16位整数,DWORD为无符号32位整数),各个域的说明如下:

bfType

指定文件类型,必须是0x424D,即字符串”BM”,也就是说所有.bmp文件的头两个字节都是”BM”

bfSize

指定文件大小,包括这14个字节

bfReserved1,bfReserved2

为保留字,不用考虑

bfOffBits

为从文件头到实际的位图数据的偏移字节数,即图5中前三个部分的长度之和。

第二部分为位图信息头BITMAPINFOHEADER,也是一个结构,其定义如下:

typedef struct tagBITMAPINFOHEADER{

DWORD biSize;

LONG biWidth;

LONG biHeight;

WORD biPlanes;

WORD biBitCount

DWORD biCompression;

DWORD biSizeImage;

LONG biXPelsPerMeter;

LONG biYPelsPerMeter;

DWORD biClrUsed;

DWORD biClrImportant;

} BITMAPINFOHEADER;

这个结构的长度是固定的,为40个字节(WORD为无符号16位整数,DWORD无符号32位整数,LONG为32位整数),各个域的说明如下:

biSize

指定这个结构的长度,为40

biWidth

指定图象的宽度,单位是象素

biHeight

指定图象的高度,单位是象素

biPlanes

必须是1,不用考虑

biBitCount

指定表示颜色时要用到的位数,常用的值为1(黑白二色图), 4(16色图), 8(256色), 24(真彩色图)(新的.bmp格式支持32位色,这里就不做讨论了)。

biCompression

指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些Windows定义好的常量)。要说明的是,Windows位图可以采用RLE4,和RLE8的压缩格式,但用的不多。我们今后所讨论的只有第一种不压缩的情况,即biCompression为BI_RGB的情况。

biSizeImage

指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出来:biSizeImage=biWidth’ * biHeight

要注意的是:上述公式中的biWidth’必须是4的整倍数(所以不是biWidth,而是biWidth’,表示大于或等于biWidth的,离4最近的整倍数。举个例子,如果biWidth=240,则biWidth’=240;如果biWidth=241,biWidth’=244)

如果biCompression为BI_RGB,则该项可能为零

biXPelsPerMeter

指定目标设备的水平分辨率,单位是每米的象素个数,关于分辨率的概念,我们将在打印部分详细介绍。

biYPelsPerMeter

指定目标设备的垂直分辨率,单位同上。

biClrUsed

指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次方。

biClrImportant

指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。

第三部分为调色板(Palette),当然,这里是对那些需要调色板的位图文件而言的。有些位图,如真彩色图,前面已经讲过,是不需要调色板的,BITMAPINFOHEADER后直接是位图数据。

调色板实际上是一个数组,共有biClrUsed个元素(如果该值为零,则有2的biBitCount

次方个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:typedef struct tagRGBQUAD {

BYTE rgbBlue; //该颜色的蓝色分量

BYTE rgbGreen; //该颜色的绿色分量

BYTE rgbRed; //该颜色的红色分量

BYTE rgbReserved; //保留值

} RGBQUAD;

第四部分就是实际的图象数据了。对于用到调色板的位图,图象数据就是该像素颜在调色板中的索引值,对于真彩色图,图象数据就是实际的R,G,B值。下面就2色,16色,256色位图和真彩色位图分别介绍。

对于2色位图,用1位就可以表示该像素的颜色(一般0表示黑,1表示白),所以一个字节可以表示8个像素。

对于16色位图,用4位可以表示一个像素的颜色,所以一个字节可以表示2个像素。

对于256色位图,一个字节刚好可以表示1个像素。

对于真彩色图,三个字节才能表示1个像素,哇噻,好费空间呀,没办法,谁叫你想让图的颜色显得更亮丽呢,有得必有失嘛。

要注意两点:

1.每一行的字节数必须是4的整倍数,如果不是,则需要补齐。这在前面介绍biSizeImage 时已经提到了。

2.一般来说,.BMP文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个像素,然后是左边第二个像素。。。接下来是倒数第二行左边第一个像素,左边第二个像素。。。依次类推,最后得到的是最上面一行的最右一个像素。

好了,终于介绍完bmp文件结构了,是不是觉得头有些大?别着急,对照着下面的程序,你就会很清楚了(我可是最爱看源程序的了,呵呵)

3.显示一个bmp文件的C程序

下面的函数LoadBmpFile,其功能是从一个.bmp文件中读取数据(包括BITMAPINFOHEADER,调色板和实际图象数据)将其存储在一个全局内存句柄hImgData中,这个hImgData将在以后的图象处理程序中用到。同时填写一个类型为HBITMAP的全局变量hBitmap和一个类型为HPALETTE的全局变量hPalette。这两个变量将在处理WM_PAINT消息时用到,用来显示出位图。该函数的两个参数分别是用来显示位图的窗口句柄,和.bmp文件名(全路径),当函数成功时,返回TRUE,否则返回FALSE

BITMAPFILEHEADER bf;

BITMAPINFOHEADER bi;

BOOL LoadBmpFile (HWND hWnd,char *BmpFileName)

{

HFILE hf; //文件句柄

LPBITMAPINFOHEADER lpImgData; //指向BITMAPINFOHEADER结构的指针

LOGPALETTE *pPal; //指向逻辑调色板结构的指针

LPRGBQUAD lpRGB; //指向RGBQUAD结构的指针

HPALETTE hPrevPalette; //用来保存设备中原来的调色板

HDC hDc; //设备句柄

HLOCAL hPal; //存储调色板的局部内存句柄

DWORD LineBytes; //每一行的字节数

DWORD ImgSize; //实际的图象数据占用的字节数

DWORD NumColors; //实际用到的颜色数,即调色板数组中的颜色个数DWORD i;

if((hf=_lopen(BmpFileName,OF_READ))==HFILE_ERROR){

MessageBox(hWnd,"File c:\\test.bmp not found!","Error Message",

MB_OK|MB_ICONEXCLAMATION);

return FALSE; //打开文件错误,返回

}

//将BITMAPFILEHEADER结构从文件中读出,填写到bf中

_lread(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));

//将BITMAPINFOHEADER结构从文件中读出,填写到bi中

_lread(hf,(LPSTR)&bi,sizeof(BITMAPINFOHEADER));

//我们定义了一个宏 #define WIDTHBYTES(i) ((i+31)/32*4)

//上面曾经提到过,每一行的字节数必须是4的整倍数,

//只要调用WIDTHBYTES(bi.biWidth*bi.biBitCount)就能完成这一换算

//举一个例子,对于2色图,如果图象宽是31,则每一行需要31位存储,合3个字节加//7位,因为字节数必须是4的整倍数,所以应该是4,而此时的//biWidth=31,biBitCount=1,WIDTHBYTES(31*1)=4,和我们设想的一样。

//再举一个256色的例子,如果图象宽是31,则每一行需要31个字节存储,因为字节数//必须是4的整倍数,所以应该是32,而此时//biWidth=31,biBitCount=8,WIDTHBYTES(31*8)=32,和我们设想的一样。你可以多举//几个例子来验证一下

//LineBytes为每一行的字节数

LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);

//ImgSize为实际的图象数据占用的字节数

ImgSize=(DWORD)LineBytes*bi.biHeight;

//NumColors为实际用到的颜色数,即调色板数组中的颜色个数

if(bi.biClrUsed!=0)

NumColors=(DWORD)bi.biClrUsed; //如果bi.biClrUsed不为零,就是本图象实际 //用到的颜色数

else //否则,用到的颜色数为2的biBitCount次方。

switch(bi.biBitCount){

case 1:

NumColors=2;

break;

c ase 4:

NumColors=16;

break;

c ase 8:

NumColors=256;

break;

c ase 24:

NumColors=0; //对于真彩色图,没用到调色板

break;

default:

//不处理其它的颜色数,认为出错。

MessageBox(hWnd,"Invalid color numbers!","Error

Message",MB_OK|MB_ICONEXCLAMATION);

_lclose(hf);

return FALSE; //关闭文件,返回FALSE

}

if(bf.bfOffBits!=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER)))

{

//计算出的偏移量与实际偏移量不符,一定是颜色数出错

MessageBox(hWnd,"Invalid color numbers!","Error Message" ,MB_OK| MB_ICONEXCLAMATION);

_lclose(hf);

return FALSE; //关闭文件,返回FALSE

}

bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors

*sizeof(RGBQUAD)+ImgSize;

//分配内存,大小为BITMAPINFOHEADER结构长度加调色板+实际位图数据

if((hImgData=GlobalAlloc(GHND,(DWORD)(sizeof(BITMAPINFOHEADER)+

NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL)

{

//分配内存错误

M essageBox(hWnd,"Error alloc memory!","ErrorMessage",MB_OK|

MB_ICONEXCLAMATION);

_lclose(hf);

return FALSE; //关闭文件,返回FALSE

}

//指针lpImgData指向该内存区

lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);

//文件指针重新定位到BITMAPINFOHEADER开始处

_llseek(hf,sizeof(BITMAPFILEHEADER),SEEK_SET);

//将文件内容读入lpImgData

_hread(hf,(char *)lpImgData,(long)sizeof(BITMAPINFOHEADER)

+(long)NumColors*sizeof(RGBQUAD)+ImgSize);

_lclose(hf); //关闭文件

if(NumColors!=0) //NumColors不为零,说明用到了调色板

{

//为逻辑调色板分配局部内存,大小为逻辑调色板结构长度加NumColors个 //PALETTENTRY大小

hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) +

NumColors* sizeof(PALETTEENTRY));

//指针pPal指向该内存区

pPal =(LOGPALETTE *)LocalLock(hPal);

//填写逻辑调色板结构的头

pPal->palNumEntries = NumColors;

pPal->palVersion = 0x300;

//lpRGB指向的是调色板开始的位置

lpRGB = (LPRGBQUAD)((LPSTR)lpImgData + (DWORD)sizeof(BITMAPINFOHEADER));

//填写每一项

for (i = 0; i < NumColors; i++)

{

pPal->palPalEntry[i].peRed=lpRGB->rgbRed;

pPal->palPalEntry[i].peGreen=lpRGB->rgbGreen;

pPal->palPalEntry[i].peBlue=lpRGB->rgbBlue;

pPal->palPalEntry[i].peFlags=(BYTE)0;

lpRGB++; //指针移到下一项

}

//产生逻辑调色板,hPalette是一个全局变量

hPalette=CreatePalette(pPal);

//释放局部内存

LocalUnlock(hPal);

LocalFree(hPal);

}

//获得设备上下文句柄

hDc=GetDC(hWnd);

if(hPalette) //如果刚才产生了逻辑调色板

{

//将新的逻辑调色板选入DC,将旧的逻辑调色板句柄保存在hPrevPalette

hPrevPalette=SelectPalette(hDc,hPalette,FALSE);

RealizePalette(hDc);

}

//产生位图句柄

hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpImgData, (LONG)CBM_INIT, (LPSTR)lpImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD), (LPBITMAPINFO)lpImgData, DIB_RGB_COLORS);

//将原来的调色板(如果有的话)选入设备上下文句柄

if(hPalette && hPrevPalette)

{

SelectPalette(hDc,hPrevPalette,FALSE);

RealizePalette(hDc);

}

ReleaseDC(hWnd,hDc); //释放设备上下文

GlobalUnlock(hImgData); //解锁内存区

return TRUE; //成功返回

}

上面的程序中,要说明的有两点:

第一,对于需要调色板的图,要想正确的显示,必须根据.bmp文件,产生逻辑调色板。产生的方法是:1,为逻辑调色板指针分配内存,大小为逻辑调色板结构(LOGPALETTE)长度加NumColors个PALETTENTRY大小。(调色板的每一项都是一个PALETTEENTRY结构),2,填写逻辑调色板结构的头pPal->palNumEntries = NumColors;

pPal->palVersion = 0x300; 3,从文件中读取调色板的RGB值,填写到每一项中。4,产生逻辑调色板:hPalette=CreatePalette(pPal)

第二,产生位图(BITMAP)句柄,该项工作由函数CreateDIBitmap来完成。

hBitmap=CreateDIBitmap(hDc,LPBITMAPINFOHEADER)lpImgData, (LONG)CBM_INIT, (LPSTR)lpImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD), (LPBITMAPINFO)lpImgData, DIB_RGB_COLORS);

CreateDIBitmap的作用是产生一个和Windows设备无关的位图。该函数的第一项参数为设备上下文句柄,如果位图用到了调色板,要在调用CreateDIBitmap之前将逻辑调色板选入该设备上下文中,产生hBitmap后,再把原调色板选入该设备上下文中,并释放该上下文;第二项为指向BITMAPINFOHEADER的指针;第三项就用常量CBM_INI,不用考虑;第四项为指向调色板的指针;第五项为指向BITMAPINFO(包括BITMAPINFOHEADER,调色板,及实际的图象数据)的指针;第六项就用常量DIB_RGB_COLORS,不用考虑。

上面提到了设备上下文,相信编过Windows程序的读者对它并不陌生,这里再简单的介绍一下。Windows操作系统统一管理着诸如显示,打印等操作,将它们看作是一个个的设备,每一个设备都有一个复杂的数据结构来维护。所谓设备上下文就是指这个数据结构。然而,我们不能直接和这些设备上下文打交道,只能通过引用标识它的句柄(实际上是一个整数),让Windows去做相应的处理。

产生的逻辑调色板句柄hPalette和位图句柄hBitmap要在处理WM_PAINT消息时使用,这样才能在屏幕上显示出来,处理过程如下面的程序。

static HDC hDC,hMemDC;

PAINTSTRUCT ps;

case WM_PAINT:

{

hDC = BeginPaint(hwnd, &ps); //获得屏幕设备上下文

if (hBitmap) //hBitmap一开始是NULL,当不为NULL时表示有图

{

hMemDC = CreateCompatibleDC(hDC); //建立一个内存设备上下文

if (hPalette) //有调色板

{

//将调色板选入屏幕设备上下文

SelectPalette (hDC, hPalette, FALSE);

//将调色板选入内存设备上下文

SelectPalette (hMemDC, hpalette, FALSE);

RealizePalette (hDC);

}

//将位图选入内存设备上下文

SelectObject(hMemDC, hBitmap);

//显示位图

BitBlt(hDC, 0, 0, bi.biWidth, bi.biHeight, hMemDC, 0, 0, SRCCOPY);

//释放内存设备上下文

DeleteDC(hMemDC);

}

//释放屏幕设备上下文

EndPaint(hwnd, &ps);

break;

}

在上面的程序中,我们调用CreateCompatibleDC创建一个内存设备上下文。SelectObject 函数将于设备无关的位图选入内存设备上下文中。然后我们调用BitBlt函数在内存设备上下文和屏幕设备上下文中进行位拷贝。由于所有操作都是在内存中进行,所以是最快的。

BitBlt函数的参数分别为:1.目标设备上下文,在上面的程序里,为屏幕设备上下文,如果改成打印设备上下文,就不是显示位图,而是打印;2.目标矩形左上角点x坐标;3. 目标矩形左上角点y坐标,在上面的程序中,2和3为(0,0),表示显示在窗口的左上角;4.目标矩形的宽度;5. 目标矩形的高度;6. 源设备上下文,在上面的程序里,为内存设备上下文;7. 源矩形左上角点x坐标;8. 源矩形左上角点y坐标;9.操作方式,在这里为SRCCOPY,表示直接将源矩形拷贝到目标矩形。还可以是反色,擦除,做“与”运算等操作,具体细节见VC++帮助。你可以试着改改第2,3,4,5,7,8,9项参数,就能体会到它们的含义了。

哇,终于讲完了。是不是觉得有点枯燥?这一章是有点儿枯燥,特别是当你对Windows 的编程并不很清楚时,就更觉得如此。不过,当一幅漂亮的bmp图显示在屏幕上时,你还是会兴奋的大叫“Yeah”,至少当年我是这样。

特别要注意的是,退出时,别忘了释放内存和资源,这是每个程序员应该养成的习惯。这个程序并不是很完善,例如,如果一幅图很大,屏幕显示不下怎么办?你可以试着自己加上滚动条。另外,为了节省篇幅,.bmp文件名被固定为c:\test.bmp,可以加入打开文件对话框,任意选择你要显示的文件。下图为程序运行时的画面。

图4. 运行时的画面

本书所附的软盘里有本章所有的源程序(包括头文件和资源文件)和例图。

最后,再介绍一个命令行编译的窍门。为什么要用命令行编译呢?主要有两个好处:第一,不用进入IDE(集成开发环境),节省了时间,而且编译速度也比较快。

第二,对于简单的程序,不用生成项目文件.mdp或.mak,直接就能生成.exe文件,这一点,在下面的例子中可以看到。

在安装Visual C++完毕时,在bin目录下会产生一个VCVARS32.BAT文件,它的作用是在命令行编译时设置正确的环境变量,如存放头文件的INCLUDE目录,存放库文件的LIB目录等,如果你没找到这个批处理文件,可以参考下面的例子,自己做一个批处理。

@echo off

set MSDevDir=d:\MSDEV

set VcOsDir=WIN95

set PATH="%MSDevDir%\BIN";"%MSDevDir%\BIN\%VcOsDir%";"%PATH%"

set INCLUDE=%MSDevDir%\INCLUDE;%MSDevDir%\MFC\INCLUDE;%INCLUDE%

set LIB=%MSDevDir%\LIB;%MSDevDir%\MFC\LIB;%LIB%

set VcOsDir=

只要把上面的“d:\MSDEV”改成你自己的VC目录就可以了。在DOS PROMPT下执行该批处理文件,执行set命令,你就能看到新设置的环境变量了。如下所示

PATH=D:\MSDEV\BIN;D:\MSDEV\BIN\WIN95;C:\WIN95;C:\WIN95\COMMAND;C:\WIN95\SYST EM;

INCLUDE=d:\msdev\INCLUDE;d:\msdev\MFC\INCLUDE;

LIB=d:\msdev\LIB;d:\msdev\MFC\LIB;

现在我们就可以进行命令行编译了。(当然,你也可以使用IDE,先new一个project,然后把.c和.rc文件插入到project中,编译运行。)

首先编译资源文件,输入rc bmp.rc,将生成bmp.res文件,接着输入

cl bmp.c bmp.res user32.lib gdi32.lib,就生成bmp.exe 了。可以看到,我们并没有用到项目文件,所以,对于这种简单的程序来说,使用命令行编译还是非常方便的。好了,运行bmp.exe,欣赏一下你今天的劳动成果。

真值原码反码补码详解和习题

原码、反码和补码的概念 本节要求 掌握原码、反码、补码的概念 知识精讲 数值型数据的表示按小数点的处理可分为定点数和浮点数;按符号位有原码、反码和补码三种形式的机器数。 一.计算机中数据的表示方法 1、数的定点与浮点表示 在计算机内部,通常用两种方法来表示带小数点的数,即所谓的定点数和浮点数。 ①定点数:是小数点在数中的位置是固定不变的数,数的最高位为符号位,小数点可在符号位之后,也可在数的末尾,小数点本身不需要表示出来,它是隐含的。 缺点:只有纯小数或整数才能用定点数表示; ②浮点数:小数点在数中的位置是浮动的、不固定的数。 一般浮点数既有整数部分又有小数部分,通常对于任何一个二进行制数N,总可以表示成:N=±2P×S N、P、S均为二进制数, P为N的阶码,一般为定点整数,常用补码表示,阶码指明小数点在数据中的位置,它决定浮点的表示范围 S为N的尾数,一般为定点小数,常用补码或原码表示,尾数部分给出了浮点数的有效数字位数,它决定了浮点数的精度,且规格化浮点数0.5≤|S|<1; 0.1B=( 1/2 )D =( 2-1)D 0.11B=(1/2 + 1/4 )D =( 2-1+2-2)D 0.111B=(1/2 + 1/4 + 1/8 )D =( 2-1+2-2+2-3)D --------------------------- 在计算机中表示一个浮点数其结构为: 假设用八个二进制位来表示一个浮点数,且阶码部分占4位,其中阶符占一位;尾数部分占4位,尾符也占一位。 若现有一个二进制数N=(101100)2可表示为:2110×0.1011,则该数在机器内的表示形式为:101100B= 10110B * (21)D 101100B= 1011B * (22)D 101100B= 101.1B * (23)D 101100B= 10.11B * (24)D 101100B= 1.011B * (25)D 101100B= 0.1011B * (26110 一个浮点形式的尾数S若满足0.5≤|S|<1,且尾数的最高位数为1,无无效的0,则该浮点数称为规格化数;规格化数可以提高运算的精度。 S为原码表示,则S1=1 规格化数 S为补码表示N为正数,则S1 =1 N为负数,则S1=0

数字图像处理大作业

大作业指导书 题目:数字图像处理 院(系):物联网工程学院 专业: 计算机 班级:计算机1401-1406 指导老师: 学号: 姓名: 设计时间: 2016-2017学年 1学期

摘要 (3) 一、简介 (3) 二、斑点数据模型 .参数估计与解释 (4) 三、水平集框架 (5) 1.能量泛函映射 (5) 2.水平集传播模型 (6) 3.随机评估方法 (7) 四、实验结果 (8) 五、总结 (11)

基于水平集方法和G0模型的SAR图像分割 Abstract(摘要) 这篇文章提出了一种分割SAR图像的方法,探索利用SAR数据中的统计特性将图像分区域。我们假设为SAR图像分割分配参数,并与水平集模型相结合。分布属于G分布中的一种,处于数据建模的目的,它们已经成功的被用于振幅SAR图像中不同区域的建模。这种统计数据模型是驱动能量泛函执行区域映射的基础,被引用到水平集传播数值方案中,将SAR 图像分为均匀、异构和极其异构区域。此外,我们引入了一个基于随机距离和模型的评估过程,用于量化我们方法的鲁棒性和准确性。实验结果表明,我们的算法对合成和真实SAR 数据都具有准确性。+ 简介 1、Induction(简介) 合成孔径雷达系统是一种成像装置,采用相干照明比如激光和超声波,并会受到斑点噪声的影响。在SAR图像处理过程中,返回的是斑点噪声和雷达切面建模在一起的结果。这个积性模型(文献[1])因包含大量的真实SAR数据,并且在获取过程中斑点噪声被建模为固有的一部分而被广泛应用。因此,SAR图像应用区域边界和目标检测变得更加困难,可能需要斑点去除。因此,斑点去除是必需的,有效的方法可以在文献[2][3][4][5][6][7][8][9][10]中找到。 对于SAR图像分割,水平集方法构成一类基于哈密顿-雅克比公式的重要算法。水平集方法允许有效的分割标准公式,从文献[12]中讨论的传播函数项可以得到。经典方法有着昂贵的计算成本,但现在的水平集的实现配置了有趣的低成本的替换。 水平集方法的一个重要方面,比如传播模型,可以用来设计SAR图像的分割算法。这个传播函数能够依据伽马和伽马平方根法则将斑点统计进行整合,函数已经被广泛地应用于SAR图像中的均质区域分割。Ayed等基于伽马分布任意建模,设计方案将SAR图像分成多个均质区域。尽管多区分割问题已经解决,该方案人需要一定数量的区域作为输入。Shuai 和Sun在文献[16]中提出对这个方法进行了改进,他们使用了一个有效的传播前收敛判断。Marques等引入了一个类似于含有斑点噪声图像中目标检测的框架,将基于本地区域的斑点噪声统计融合进去。这些作者采用伽马平方根对均质区域进行建模并用一个自适应窗口方案检测本地的同质性。 最近,新的SAR数据模型比如K,G,显示出了优势。经典法则受限于均质区域特性的描述,而最近的法则展现出了在数据建模中更有吸引力的特性。法则允许同构、异构和高度异构幅度SAR数据的建模。这个分布族提供了一组参数,可以描述SAR图像中的不同区域。分布的参数信息,可以被广泛的应用于设计SAR图像处理和分类技术。在文献[21]中,Mejail 等人介绍了SAR监督数据分类器,它基于其参数映射并实现了有趣的结果。Gambini等人在文献[22]中使用这个分布的一个参数来量化SAR数据的粗糙度,通过活动轮廓和B样条差值来检测边缘。然而,这种技术需要一个初始分割步骤,并受拓扑限制。一般来说,活动轮廓方法不能解决不连续区域分割的问题。 本文介绍了一种新的水平集算法来实现SAR图像中均质、异构和极其异构区域分割的目标。由于分布能够描述SAR图像的同质性和规模,我们的方法采用分布对斑点数据进行建模。这些分布参数基于每一个域点进行估计,通过这些信息,我们可以在水平集分割框架内得到一个能量泛函来驱动向前传播(front propagation)。该泛函以最大化不同区域平均能量间的差异作为结束。最终水平集阶段以能量带作为依据得到SAR图像的分割结果。

数字图像处理 作业1汇总

数字图像处理 报告标题:01 报告编号: 课程编号: 学生姓名: 截止日期: 上交日期:

摘要 (1)编写函数计算灰度图像的均方误差(MSE)、信噪比(SNR)、峰值信噪比(PSNR)、平均绝对误差(MAE);(2)编写函数对灰度图像经行降采样,直接消除像素以及消除像素前进行简单平滑滤波;(3)编写函数对图像进行放大,分别使用像素直接复制和双线性插值的方法:(4)编写函数用题目给出的量化步骤Q去量化灰度图像,并给出相应的MSE和直方图;(5)编写函数对灰度图像执行直方图均衡化,显示均衡前后的直方图。同时,熟悉使用MATLAB,并且熟练操作对图像进行各种修改变换等。 KEY WORD :MATLAB MSE、PSNR 直方图量化

技术探讨 数字图像处理是基于Matlab来实现的,由于Matlab 独特的功能和对矩阵,图像,函数灵活的处理,因而用于图像的处理相当的方便。 task1 均方误差(MSE),信噪比(SNR),峰值信噪比(PSNR),平均绝对误差(MAE)。可以使用使用for循环语句,分别计算图像MSE/SNR/PSNR/MAE,具体的计算公式见附录代码,下面只附运算原理代码 均方误差(MSE): sum=sum+(a(i,j)-b(i,j))^2; MSE=sum/(M*N) 信噪比(SNR): sum2=sum2+a(i,j)^2; SNR=10*log10(sum2/MSE) 峰值信噪比(PSNR): sum=sum+(a(i,j)-b(i,j))^2; PSNR=10*log10(255^2/MSE) 平均绝对误差(MAE): sum=sum+a(i,j)+b(i,j); MAE=sum/(M*N) 在每次对同一个图像处理时它们的均方误差(MSE),信噪比(SNR),峰值信噪比(PSNR),平均绝对误差(MAE)都会有所不同,因为它是原图像与加噪后的图像比较,而电脑的每次操作都会对加噪过得图像有影响。 task3 按比例缩小灰度图像 (1)直接消除像素点: I1=g(1:m:end,1:m:end);I1 为缩小后的图像,g为原图。 (2)先平滑滤波再消除像素点: 滤波函数,g=imfilter(I,w,'corr','replicate'); task4 对图像的放大运用了pixel repetition法以及双线性插值法: 它有三种插值法:即最近邻插值(pixel repetition)、双线性插值、双三次插值(缩放倍数为0.5) ;缩放与放大由给定的参数来确定。 ;缩放与放大由给定的参数来确定。而缩小则同样适用I1=g(1:m:end,1:m:end); 而放大的代码为“J=imresize(I,m,'nearest');%使用pixel repetition法”和“J=imresize(I,m,'bilinear');%使用双线性插值法” 放大倍数更改m值即可 task4 对图像的量化,使用“J=histeq(I,x); ”,x为可变的量化步长 task5 灰度图像的量化和直方图均衡化直接调用函数。“J=histeq(I)”“imhist(I,64)”

原码、反码、补码详解

本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有 不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数+3 ,计算机字长为8位,转换成二进制就是00000011。如果是-3 ,就是10000011 。 那么,这里的00000011 和10000011 就是机器数。 2、真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数10000011,其最高位1代表负,其真正数值是-3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 例:0000 0001的真值= +000 0001 = +1,1000 0001的真值= –000 0001 = –1 二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码 方式. 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制: [+1]原 = 0000 0001 [-1]原 = 1000 0001 第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:

数字图像处理大作业

1、下图是一用于干涉原理进行测试的干涉场图像,要求判读条纹的间距,请给 出图像处理的方案并说明每一步的作用及其对其它处理步骤可能产生的影响。 解:步骤与思路: ○1.进行模糊处理,消除噪声 ○2.边缘检测,进行图像增强处理 ○3.二值化图像,再进行边缘检测,能够得到很清晰的边界。 ○4.采用横向标号法,根据值为1像素在标号中的相邻位置可以确定间距 I=imread('xz mjt.bmp'); I1=medfilt2(I); %对图像中值滤波 imshow(I1); [m,n]=size(I1); for i=1:m for j=1:n if(I1(i,j)<100) %阈值为100 I1(i,j)=255; else I1(i,j)=0; %进行二值化 end end end figure; imshow(I1);

Y1=zeros(1,25); y2=y1; c=y2; i=100; for j=1:1200 if (I1(i,j)==255&&I1(i,j+1)==0) Y1=j+1; end if (I1(i,j)==0&&I1(i,j+1)==255) Y2=j; end end for i=1:25 c=Y2(i)-Y1(i) end c %找出每两个条纹之间的距离

2. 现有8个待编码的符号m0,……,m7,它们的概率分别为0.11,0.02,0.08,0.04,0.39,0.05,0.06,0.25,利用哈夫曼编码求出这一组符号的编码并画出哈夫曼树。 3. 请以图像分割方法为主题,结合具体处理实例,采用期刊论文格式,撰写一篇小论文。

数字图像处理部分作业答案

3.数字化图像的数据量与哪些因素有关? 答:数字化前需要决定影像大小(行数M、列数N)和灰度级数G的取值。一般数字图像灰度级数G为2的整数幂。那么一幅大小为M*N,灰度级数为G的图像所需的存储空间M*N*g(bit),称为图像的数据量 6.什么是灰度直方图?它有哪些应用?从灰度直方图你能获得图像的哪些信息? 答:灰度直方图反映的是一幅图像中各灰度级像素出项的频率之间的关系。以灰度级为横坐标,纵坐标为灰度级的频率,绘制频率同灰度级的关系图就是灰度直方图。 应用:通过变换图像的灰度直方图可以,使图像更清晰,达到图像增强的目的。 获得的信息:灰度范围,灰度级的分布,整幅图像的平均亮度。但不能反映图像像素的位置。 2. 写出将具有双峰直方图的两个峰分别从23和155移到16和255的图像线性变换。 答:将a=23,b=155 ;c=16,d=255代入公式: 得 1,二维傅里叶变换有哪些性质?二维傅里叶变换的可分离性有何意义? 周期性,线性,可分离性,比例性质,位移性质,对称性质,共轭对称性,差分,积分,卷积,能量。 意义:分离性表明:二维离散傅立叶变换和反变换可用两组一维离散傅立叶变换和反变换来完成。 8.何谓图像平滑?试述均值滤波的基本原理。 答:为了抑制噪声改善图像质量所进行的处理称图像平滑或去噪。 均值滤波是一种局部空间域处理的算法,就是对含有噪声的原始图像f(x,y)的每个像素点取一个领域S,计算S中所有像素的灰度级平均值,作为空间域平均处理后图像g(x,y)像素值。 9.何谓中值滤波?有何特点? 答:中值滤波是对一个滑动窗口内的诸像素灰度值排序,用中值代替窗口中心像素的原来灰度值,它是一种非线性的图像平滑法。 它对脉冲干扰及椒盐噪声的的图像却不太合适。抑制效果好,在抑制随机噪声的同时能有效保护边缘少受模糊。但它对点、线等细节较多 6图像几何校正的一般包括哪两步?像素灰度内插有哪三种方法?各有何特点? 答:1)建立失真图像和标准图像的函数关系式,根据函数关系进行几何校正。 2)最近邻插值,双线性插值,三次卷积法 3)最近邻插值:这种插值方法运算量小,但频域特性不好。 3、若f(1,1)=4,f(1,2)=7,f(2,1)=5,f(2,2)=6,分别按最近邻元法、双线性插值法确定点(1.2,1.6)的灰度值。 最近邻元法:点(1.2,1.6)离(1,2)最近,所以其灰度值为7.双线性法:f(i+u,j+v)=(1-u)(1-v)f(i,j)+(1-u)vf(i,j+1)+u(1-v)f(i+1,j)+uvf(i+1,j+1) 将i=1,j=1,u=0.2,v=0.6代入,求得:f(i+u,j+v)=5.76。四舍五入取整后,得该点其灰度值为6

数字图像处理大作业

大作业要求 1.数字图像处理中的图像增强、图像分割、数学形态学、图像编码这几个章节中,围绕你所感兴趣的题目写一篇综述。 2.要求: (1)在中国知网上下载5篇以上相关文章,结合上课所学内容,确定综述的内容。(2)文字3000字以上,包含 a. 课题背景和概述 b. 国内外研究现状 c. 技术应用(可以实现哪些功能,实 现的方法及结果 d. 结论 e. 学习体会 f.参考文献 (3)综述的排版: 正文层次格式如下: 1(空两格)×××××(居中,三号宋体,加粗,占4行) 1.1×××(左顶格,四号宋体,加粗,占 2.5行,不接排) 1.1.1×××(左顶格,小四号宋体,加粗,占2行,不接排) a.(左空两格,a.后空一格)×××(小4号宋体,加粗) (正文)×××××(小4 号宋体,接排)

(1)(左空两格,(1)后空一格)×××(小4号宋体,加粗) (正文)×××××(小4号宋体,接排) 1)(左空两格,1)后空一格)(小4号宋体,加粗) (正文)×××××(小4号宋体,接排) 正文中段落一律段前、段后0磅,行距为20磅,对齐方式:两端对齐。小4号字体。 论文中的图和表居中,并且有图题和表题。 例如: 图 1 主站工作过程(5号字体,加粗) 表1 不同总线速率下从站的延迟时间(5号字体,加粗) 速率(Kbit/s ) 9.6 19.2 93.75 187.5 500 1500 1200SDR minT (bit T ) 11 11 11 11 11 11 11 SDR maxT (bit T ) 60 60 60 60 100 150 800 参考文献按照下面形式给出: 参考文献 (居中,三号,宋体,加粗,占4行)

什么是原码反码补码

什么是原码反码补码 1100110011 原 1011001100 反除符号位,按位取反 1011001101 补除符号位,按位取反再加1 正数的原反补是一样的 ◆一个正数的补码和其原码的形式相同。 如果定义了一个整型变量i: int i;/*定义为整型变量*/ i=lO;/*给i赋以整数10*/ 十进制数10的二进制形式为1010,在微机上使用的C编译系统,每一个整型变量在内存中占2个字节。 图2.2(a)是数据存放的示意图。图2.2(b)是数据在内存中实际存放的情况。 图2.2 ◆求负数的补码的方法是:将该数的绝对值的二进制形式,按位取反再加1。 例如求-10的补码:①取-10的绝对值10;②10的绝对值的二进制形式为1010; ③对1010取反得1111111111110101(一个整数占16位);④再加1得1111111111110110,见图2.3。

整数的16位中,最左面的一位是表示符号的,该位为0,表示数值为正;为1 则数值为负。 北桥,南桥是主板上芯片组中最重要的两块了.它们都是总线控制器.他们是总线控制芯片.相对的来讲,北桥要比南桥更加重要.北桥连接系统总线,担负着cpu 访问内存的重任.同时连接这AGP插口,控制PCI总线,割断了系统总线和局部总线,在这一段上速度是最快的.南桥不和CPU连接通常用来作I/O和IDE设备的控制.所以速度比较慢.一般情况下,南桥和北桥中间是PCI总线. 1。南桥和北桥芯片主要区别是什么? 南桥主要是负责IO 北桥用于CPU和内存、显卡、PCI交换数据 2。如何巧妙辨别南桥和北桥芯片? 用功能辨别南桥芯片和北桥芯片: 北桥 它主要负责CPU与内存之间的数据交换,并控制AGP、PCI数据在其内部的传输,是主板性能的主要决定因素。随着芯片的集成度越来越高,它也集成了不少其它功能。如:由于Althon64内部整合了内存控制器;nVidia在其NF3 250、NF4等芯片组中,去掉了南桥,而在北桥中则加入千兆网络、串口硬盘控制等功能。现在主流的北桥芯征的牌子有VIA、NVIDIA及SIS等。 当然这些芯片的好坏并不是由主板生产厂家所决定的,但是主板生产商采取什么样的芯片生产却是直接决定了主板的性能。如:同样是采用VIA的芯片,性能上则有KT600>KT400A>KT333>KT266A等。目前主流的AMD平台上,可选的芯片组有:KT600、NF2、K8T800、NF3等;对于INTEL平台,则有915、865PE、PT880、845PE、848P等。 南桥 南桥芯片主要是负责I/O接口等一些外设接口的控制、IDE设备的控制及附加功能等等。常见的有VIA的8235、8237等;INTEL的有CH4、CH5、CH6等;nVIDIA 的MCP、MCP-T、MCP RAID等。在这部分上,名牌主板与一般的主板并没有很大的差异,但是名牌主板凭着其出色的做工,还是成为不少人的首选。而不排除一部分质量稍差的主板为了在竞争中取得生存,可能会采用功能更强的南桥以求在功能上取胜。 用芯片在主版上的位置辨别南桥芯片和北桥芯片: 北桥芯片就是位于和CPU插槽附近的一块芯片,其上面一般都覆盖了散热片

《数字图像处理》复习大作业及答案

2014年上学期《数字图像处理》复习大作业及参考答案 ===================================================== 一、选择题(共20题) 1、采用幂次变换进行灰度变换时,当幂次取大于1时,该变换是针对如下哪一类图像进行增 强。(B) A 图像整体偏暗 B 图像整体偏亮 C图像细节淹没在暗背景中D图像同时存在过亮和过暗背景 2、图像灰度方差说明了图像哪一个属性。(B ) A 平均灰度 B 图像对比度 C 图像整体亮度D图像细节 3、计算机显示器主要采用哪一种彩色模型( A ) A、RGB B、CMY或CMYK C、HSI D、HSV 4、采用模板[-1 1]T主要检测( A )方向的边缘。 A.水平 B.45? C.垂直 D.135? 5、下列算法中属于图象锐化处理的是:( C ) A.低通滤波 B.加权平均法 C.高通滤波 D. 中值滤波 6、维纳滤波器通常用于( C ) A、去噪 B、减小图像动态范围 C、复原图像 D、平滑图像 7、彩色图像增强时, C 处理可以采用RGB彩色模型。 A. 直方图均衡化 B. 同态滤波 C. 加权均值滤波 D. 中值滤波 8、__B__滤波器在对图像复原过程中需要计算噪声功率谱和图像功率谱。 A. 逆滤波 B. 维纳滤波 C. 约束最小二乘滤波 D. 同态滤波 9、高通滤波后的图像通常较暗,为改善这种情况,将高通滤波器的转移函数加上一常数量以 便引入一些低频分量。这样的滤波器叫B。 A. 巴特沃斯高通滤波器 B. 高频提升滤波器 C. 高频加强滤波器 D. 理想高通滤波器 10、图象与灰度直方图间的对应关系是 B __ A.一一对应 B.多对一 C.一对多 D.都不 11、下列算法中属于图象锐化处理的是:C A.低通滤波 B.加权平均法 C.高通滤 D. 中值滤波 12、一幅256*256的图像,若灰度级数为16,则存储它所需的比特数是:( A ) A、256K B、512K C、1M C、2M 13、噪声有以下某一种特性( D ) A、只含有高频分量 B、其频率总覆盖整个频谱 C、等宽的频率间隔内有相同的能量 D、总有一定的随机性 14. 利用直方图取单阈值方法进行图像分割时:(B) a.图像中应仅有一个目标 b.图像直方图应有两个峰 c.图像中目标和背景应一样大 d. 图像中目标灰度应比背景大 15. 在单变量变换增强中,最容易让人感到图像内容发生变化的是( C )

数字图像处理作业 1

数字图像处理作业 1 1.基本问题 a.什么是数字图像处理,英语全称是什么? 数字图像处理:对图像进行一些列的操作,以达到预期目的的技术,可分为模拟图像处理和数字图像处理两种方式。英文全称:Image Processing b.数字图像处理与什么领域的发展密切相关? 数字图像处理与数字计算机的发展,医学,遥感,通信,文档处理和工业自动化等许多领域的发展密切相关。 c.人类主要通过什么来感知获取信息的? 主要通过人的视觉、味觉、嗅觉、触觉、听觉以及激光、量子通信、现代计算机网络、卫星通信、遥感技术、数码摄影、摄像等来获取信息。 d.数字图像处理技术与哪些学科领域密切相关? 与数学、物理学、生理学、心理学、电子学、计算机科学等学科密切相关 e.数字图像处理在哪些领域得到广泛应用? 数字图像处理的应用越来越广泛,已渗透到工程、工业、医疗保健、航空航天、军事、科研、安全保卫等各个领域。 f.数字图像处理起源于什么年代? 20世纪20年代 g.现代大规模的图像处理需要具备哪些计算机能力? 需要具备图像处理、图像分析、图像理解计算机能力 h.根据人的视觉特点,图像可分为哪两种图像? 分为可见图像和不可见图像。 i.根据光的波段,图像可分为哪几种图像? 分为单波段、多波段和超波段图像。 j.图像数字与模拟图像的本质区别是什么? 区别: 模拟图像:空间坐标和明暗程度都是连续变化的、计算机无法直接处理。 数字图像:空间的坐标和灰度都不连续、用离散的数字表示,能被计算机处理。 2.通过互联网,查下数字图像处理有哪些应用?选一个应用范例即可。具体描绘如何通过数字图像处理技术来实现其应用。要有图像范例说明。 数字图像处理主要应用领域有:生物医学,遥感领域,工业方面,军事公安领域,通信领域,交通领域等。我就生物医学领域做一个简单介绍。 自伦琴1895年发现X射线以来,在医学领域可以用图像的形式揭示更多有用的医学信息医学的诊断方式也发生了巨大的变化。随着科学技术的不断发展,现代医学已越来越离不开医学图像的信息处理,医学图像在临床诊断、教学科研等方面有重要的作用。目前的医学图像主要包括CT (计算机断层扫描) 图像、MRI( 核磁共振)图像、B超扫描图像、数字X 光机图像、X 射线透视图像、各种电子内窥镜图像、显微镜下病理切片图像等。 医学图像处理跨计算机、数学、图形学、医学等多学科研究领域,医学图像处理技术包括图像变换、图像压缩、图像增强、图像平滑、边缘锐化、图像分割、图像识别、图像融合等等。在此联系数字图像处理的相关理论知识和步骤设计规划系统采集和处理的具体流程同时充分考虑到图像采集设备的拍摄效果以及最终处理结果的准确性。下面是关于人体微血管显微图像的采集实例。

原码、反码与补码知识讲解

2.2 原码、反码与补码 在计算机内的数(称之为“机器数”)值有3种表示法:原码、反码和补码。所谓原码就是带正、负号的二进制数,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。由此可见,这三种表示法中,关键是负数的表示方式不一样。 2.2.1 正负数表示、定点数与浮点数 在计算机内,通常把1个二进制数的最高位定义为符号位,用“0”表示正数,“1”表示负数;其余位表示数值。 规定小数点位置固定不变的数称为“定点数”;小数点的位置不固定,可以浮动的数称为“浮点数”。 2.2.2 原码 原码表示法是定点数的一种简单的表示法。用原码表示带符号二进制数时,符号位用0表示正,1表示负;数值位保持不变。原码表示法又称为符号-数值表示法。 1. 小数原码表示法 设有一数为x,则原码表示可记作[x]原(下标表示)。例如,X1= +1010110 ;X2= -1001010 原码表示数的范围与二进制位数有关。设二进制小数X=±0.X1X2…Xm,则小数原码的定义如下: 例如:X=+0.1011时,根据以上公式可得[X]原=0.1011;X=-0.1011时,根据以上公式可得[X]原= 1-(-0.1011)=1.1011=1.1011 当用8位二进制来表示小数原码时,其表示范围为:最大值为0.1111111,其真值约为(0.99)10 ;最小值为1.1111111,其真值约为(-0.99)10。根据定义,小数“0”的原码可以表示成0.0…0或1.0…0。 2. 整数原码表示法 整数原码的定义如下: 例如:X=+1101时,根据以上公式可得[X]原=01101;X=-1101时,根据以上公式可得[X]原=24-(-1101)=10000+1101=11101 当用8位二进制来表示整数原码时,其表示范围为:最大值为01111111,其真值为(127)10 ;最小值为11111111,其真值为(-127)10 。同样,整数“0”的原码也有两种形式,即00…0和10…0。 2.2.3 反码 用反码表示带符号的二进制数时,符号位与原码相同,即用0表示正,用1表示负;数值位与符号位相关,正数反码的数值位和真值的数值位相同;而负数反码的数值位是真值的数值位按位变反。 1. 小数反码表示法 设二进制小数X=±0.x1x2…xm,则其反码定义为: 例如,X=+0.1011时,根据以上公式可得[X]反=0.1011;当X=-0.1011时,根据以上公式可得[X]反=2-2-4+X=10.0000-0.0001-0.1011=1.0100。根据定义,小数“0”的反码有两种表示形式,即0.0…0和1.1…1。 2. 整数反码表示法 设二进制整数X=±Xn-1Xn-2…X0,则其反码定义为: 例如,X=+1001时,根据以上公式可得[X]反= 01001;当X=-1001时,根据以上公式可得[X]反= (25-1)+X= (100000-1)+(-1001)= 11111-1001=10110 同样,整数“0”的反码也有两种形式,即00…0和11…1。

数字图像处理基础知识总结

第一章数字图像处理概论 *图像是对客观存在对象的一种相似性的、生动性的描述或写真。 *模拟图像 空间坐标和明暗程度都是连续变化的、计算机无法直接处理的图像 *数字图像 空间坐标和灰度均不连续的、用离散的数字(一般整数)表示的图像(计算机能处理)。是图像的数字表示,像素是其最小的单位。 *数字图像处理(Digital Image Processing) 利用计算机对数字图像进行(去除噪声、增强、复原、分割、特征提取、识别等)系列操作,从而获得某种预期的结果的技术。(计算机图像处理) *数字图像处理的特点(优势) (1)处理精度高,再现性好。(2)易于控制处理效果。(3)处理的多样性。(4)图像数据量庞大。(5)图像处理技术综合性强。 *数字图像处理的目的 (1)提高图像的视感质量,以达到赏心悦目的目的 a.去除图像中的噪声; b.改变图像的亮度、颜色; c.增强图像中的某些成份、抑制某些成份; d.对图像进行几何变换等,达到艺术效果; (2)提取图像中所包含的某些特征或特殊信息。 a.模式识别、计算机视觉的预处理 (3)对图像数据进行变换、编码和压缩,以便于图像的存储和传输。 **数字图像处理的主要研究内容 (1)图像的数字化 a.如何将一幅光学图像表示成一组数字,既不失真又便于计算机分析处理 b.主要包括的是图像的采样与量化 (2*)图像的增强 a.加强图像的有用信息,消弱干扰和噪声 (3)图像的恢复 a.把退化、模糊了的图像复原。模糊的原因有许多种,最常见的有运动模糊,散焦模糊等(4*)图像的编码 a.简化图像的表示,压缩表示图像的数据,以便于存储和传输。 (5)图像的重建 a.由二维图像重建三维图像(如CT) (6)图像的分析 a.对图像中的不同对象进行分割、分类、识别和描述、解释。 (7)图像分割与特征提取 a.图像分割是指将一幅图像的区域根据分析对象进行分割。 b.图像的特征提取包括了形状特征、纹理特征、颜色特征等。 (8)图像隐藏 a.是指媒体信息的相互隐藏。 b.数字水印。 c.图像的信息伪装。 (9)图像通信

西安交通大学大学数字图像处理大作业

数字图像处理

目录 作业一 (1) 一作业要求 (1) 二源代码 (1) 三运行结果 (3) 作业二 (5) 一作业要求 (5) 二算法描述 (5) 三源代码 (7) 四运行结果 (10)

作业一 一作业要求 在图像的空间域滤波操作中,会出现有部分掩膜矩阵在图像外面的情况,所以需要给图像先加入一个边界,执行完操作之后,再去掉这个边界,保证图像中所有的像素都参与矩阵运算。 二源代码 byte[,] filter(byte[,]f,float[,]mask) { int w = f.GetLength(0); int h = f.GetLength(1); byte[,] g = new byte[w,h]; int M = mask.GetLength(0)/2; int N = mask.GetLength(1)/2; for (int y=N;y255) return 255; if (v<0) return 0; return (byte)v;

} float[,] averagingMask(intM,int N) { float[,] mask = new float[2*M+1,2*N+1]; for (int m=-M;m<=M;m++) for (int n=-N;n<=N;n++) mask[M+m,N+n] = 1.0f/((2*M+1)*(2*N+1)); return mask; } byte[,] addboard(byte[,] f,intM,int N) { int w=f.GetLength(0); int h=f.GetLength(1); intgw=w+2*M; intgh=h+2*N; byte[,] g=new byte[gw,gh]; //add top board and bottom board for(inti=0;i

带符号数的原码、反码与补码分析

一.带符号数的原码、反码与补码 所谓带符号数,其实就是一个二进制数据,它的最高位所代表的是符号,其余位是其“绝对值”。例如0101_0011,这个数据如果是带符号数,那么最高位的0就是代表这个数据为正数,其后的101-0011则代表这个数据的绝对值,为+83D。如果是1101_0011,则代表-83D。 1.1 原码 原码就是按照正数的符号位为0,负数的符号位为1,其他位就是数据的绝对值即可。例如当机器字长为8bit的二进制数时,它的最高位为符号位,因此其余的7bit位数据的绝对值。因此原码所能表示的数据范围是: - (2n-1-1)~+(2n-1-1) 当字长为8bit,则原码能表示的范围就是:-127~+127 例如83的原码就是:0101_0011 当字长为16bit,则原码能表示的范围就是:-32767~+32767 例如-83的原码就是:1000_0000_0101_0011 1.2 反码 对于一个带有符号位的二进制数来说,正数的反码与其原码相同,负数的反码为其原码除符号位外其余各位按位取反。 例如当字长为8bit时,+83D的反码就是:0101_0011,-83D的反码就是1010_1100 负数的反码与原码有很大的差别,一般情况下,反码主要用来当做求二进制数补码的中间形式。反码所表示的数据范围与原码相同: - (2n-1-1)~+(2n-1-1) 1.2 补码 正数的补码与其原码相同,负数的补码为其反码在最低位加1。 例如: X=+101_1011 [X]原码=0101_1011 [X]补码=0101_1011 X=-101_1011 [X]原码=1101_1011 [X]补码=1010_0101 补码表示的范围是: - 2n-1~+(2n-1-1)

数字图像处理大作业报告

数字图像处理 实验报告 实验选题:选题二 组员: 学号: 班级: 指导老师: 实验日期:2019年5月22日

一、实验目的及原理 1.识别出芯片的引脚 2.熟悉并掌握opencv的某些函数的功能和使用方法 原理:通过滤波、形态学操作得到二值图,再在二值图中设置条件识别引脚部分。 二、实现方案 对图片滤波、调节阈值做边缘检测过滤掉一部分图片中干扰元素;然后通过膨胀、腐蚀操作来减少引脚的空心部分;再通过findContours()函数找到引脚的边缘并得到轮廓的点集,设置特定的长宽比和矩形面积识别引脚部分。 三、实验结果

四、源码 #include #include #include"opencv2/highgui/highgui.hpp" #include"opencv2/imgproc/imgproc.hpp" using namespace std; using namespace cv; int main(int argv, char **argc) { //载入图片 Mat srtImag = imread("2.jpg"); Mat G_blur = srtImag.clone(); //降噪 blur(G_blur, G_blur, Size(5, 5)); //imshow("降噪", G_blur); //Canny边缘检测 Mat Canny_Imag = G_blur; Canny_Imag = Canny_Imag > 176; Canny(G_blur, Canny_Imag, 300, 50, 3); //imshow("边缘检测", Canny_Imag); //膨胀 Mat element = getStructuringElement(MORPH_RECT, Size(10, 10)); dilate(Canny_Imag, Canny_Imag, element); //imshow("膨胀", Canny_Imag); //腐蚀 Mat element_1 = getStructuringElement(MORPH_RECT, Size(11, 11)); erode(Canny_Imag, Canny_Imag, element_1); //imshow("腐蚀", Canny_Imag); //查找轮廓 vector>contours; vectorhierarchy; findContours(Canny_Imag, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE); vector> contour_s(contours.size());//该数组共有contours.size()个轮廓的点集 vector Rec_s(contours.size());//逼近多边形的点集数组

数字图像处理大作业.doc

-------------精选文档 ----------------- 1、下图是一用于干涉原理进行测试的干涉场图像,要求判读条纹的间距,请 给出图像处理的方案并说明每一步的作用及其对其它处理步骤可能产生的影响。 解:步骤与思路: ○1.进行模糊处理,消除噪声 ○2.边缘检测,进行图像增强处理 ○3.二值化图像,再进行边缘检测,能够得到很清晰的边界。 ○4.采用横向标号法,根据值为1 像素在标号中的相邻位置可以确定间距 I=imread('xz mjt.bmp'); I1=medfilt2(I);%对图像中值滤波 imshow(I1); [m,n]=size(I1); for i=1:m for j=1:n if(I1(i,j)<100)% 阈值为 100 I1(i,j)=255; else I1(i,j)=0;%进行二值化

-------------精选文档 ----------------- end end end figure; imshow(I1); Y1=zeros(1,25); y2=y1; c=y2; i=100; for j=1:1200 if (I1(i,j)==255&&I1(i,j+1)==0) Y1=j+1; end if (I1(i,j)==0&&I1(i,j+1)==255) Y2=j; end end for i=1:25 c=Y2(i)-Y1(i) end c%找出每两个条纹之间的距离

2.现有 8 个待编码的符号 m0,,m7, 它们的概率分别为 0.11,0.02,0.08,0.04,0.39,0.05,0.06,0.25,利用哈夫曼编码求出这一组符号的编码并画出哈夫曼树。 3.请以图像分割方法为主题,结合具体处理实例,采用期刊论文格式,撰写一篇小论文。

原码补码和反码的具体定义

原码补码和反码的具体定义 数在计算机中是以二进制形式表示的。 数分为有符号数和无符号数。 原码、反码、补码都是有符号定点数的表示方法。 一个有符号定点数的最高位为符号位,0是正,1是副。以下都以8位整数为例, 原码就是这个数本身的二进制形式。 例如 0000001 就是+1 1000001 就是-1 正数的反码和补码都是和原码相同。 负数的反码是将其原码除符号位之外的各位求反 [-3]反=[10000011]反=11111100 负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。 [-3]补=[10000011]补=11111101 一个数和它的补码是可逆的。

为什么要设立补码呢? 第一是为了能让计算机执行减法: [a-b]补=a补+(-b)补 第二个原因是为了统一正0和负0 正零:00000000 负零:10000000 这两个数其实都是0,但他们的原码却有不同的表示。 但是他们的补码是一样的,都是00000000 特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!) [10000000]补 =[10000000]反+1 =11111111+1 =(1)00000000 =00000000(最高位溢出了,符号位变成了0) 有人会问 10000000这个补码表示的哪个数的补码呢? 其实这是一个规定,这个数表示的是-128

所以n位补码能表示的范围是 -2^(n-1)到2^(n-1)-1 比n位原码能表示的数多一个 又例: 1011 原码:01011 反码:01011 //正数时,反码=原码 补码:01011 //正数时,补码=原码 -1011 原码:11011 反码:10100 //负数时,反码为原码取反 补码:10101 //负数时,补码为原码取反+1 0.1101 原码:0.1101 反码:0.1101 //正数时,反码=原码 补码:0.1101 //正数时,补码=原码 -0.1101 原码:1.1101

相关文档
相关文档 最新文档