当前位置:文档之家› 24位真彩色转换为8位灰度图片(完整代码)

24位真彩色转换为8位灰度图片(完整代码)

24位真彩色转换为8位灰度图片(完整代码)
24位真彩色转换为8位灰度图片(完整代码)

24位真彩色转换为8位灰度图片(完整代码)

分类:C#2011-03-04 09:29 4343人阅读评论(5) 收藏举报nullfloatgdi+byte图像处理image

图像的灰度与二值化

https://www.doczj.com/doc/c912006803.html,/maozefa/archive/2011/12/09/2281656.html

图像的灰度化与二值化是图像处理中最常见的处理方法,也是很多图像处理方法的基础,如图像灰度统计、图像识别等。

图像的灰度化与二值化方法较多,处理过程也比较简单。但切不可因其简单而忽视效率。如常用的图像灰度计算公式:gray = red * 0.299 + green * 0.587 + blue * 0.114,如果在程序代码中直接套用了这个公式,因浮点数的缘故导致代码执行效率较低,如改为定点整数运算,可使执行效率大大提高。

下面是图像的灰度与二值化代码:

// 定义ARGB像素结构

typedef union

{

ARGB Color;

struct

{

BYTE Blue;

BYTE Green;

BYTE Red;

BYTE Alpha;

};

}ARGBQuad, *PARGBQuad;

//---------------------------------------------------------------------------

// 图像数据data灰度化

VOID Gray(BitmapData *data)

{

PARGBQuad p = (PARGBQuad)data->Scan0;

INT offset = data->Stride - data->Width * sizeof(ARGBQuad);

for (UINT y = 0; y < data->Height; y ++, (BYTE*)p += offset)

{

for (UINT x = 0; x < data->Width; x ++, p ++)

p->Blue = p->Green = p->Red =

(UINT)(p->Blue * 29 + p->Green * 150 + p->Red * 77 + 128) >> 8;

}

}

//---------------------------------------------------------------------------

// 图像数据data灰度同时二值化,threshold阀值

VOID GrayAnd2Values(BitmapData *data, BYTE threshold)

{

PARGBQuad p = (PARGBQuad)data->Scan0;

INT offset = data->Stride - data->Width * sizeof(ARGBQuad);

for (UINT y = 0; y < data->Height; y ++, (BYTE*)p += offset)

{

for (UINT x = 0; x < data->Width; x ++, p ++)

{

if (((p->Blue * 29 + p->Green * 150 + p->Red * 77 + 128) >> 8) < threshold) p->Color &= 0xff000000;

else

p->Color |= 0x00ffffff;

}

}

}

//---------------------------------------------------------------------------

因本文使用的是32位图像数据,所以图像的二值化没有采用通常的赋值操作p->Blue = p->Green = p->Red = 0(或者255),而是采用了位运算。

下面是使用BCB2007和GDI+图像数据实现图像灰度和二值化的例子代码:

// 锁定GDI+位位图扫描线到data

FORCEINLINE

VOID LockBitmap(Gdiplus::Bitmap *bmp, BitmapData *data)

{

Gdiplus::Rect r(0, 0, bmp->GetWidth(), bmp->GetHeight());

bmp->LockBits(&r, ImageLockModeRead | ImageLockModeWrite, PixelFormat32bppARGB, data);

}

//---------------------------------------------------------------------------

// GDI+位图扫描线解锁

FORCEINLINE

VOID UnlockBitmap(Gdiplus::Bitmap *bmp, BitmapData *data)

{

bmp->UnlockBits(data);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Gdiplus::Bitmap *bmp = new Gdiplus::Bitmap(L"d:\\source1.jpg");

Gdiplus::Graphics *g = new Gdiplus::Graphics(Canvas->Handle);

g->DrawImage(bmp, 0, 0);

BitmapData data;

LockBitmap(bmp, &data);

// Gray(&data);

GrayAnd2Values(&data, 128);

UnlockBitmap(bmp, &data);

g->DrawImage(bmp, data.Width, 0);

delete g;

delete bmp;

}

//---------------------------------------------------------------------------

24位真彩色转换为8位灰度图片(完整代码)

//Code By xets007

//转载请注明出处

#include

BOOL BMP24to8(char *szSourceFile,char *szTargetFile);

int main(int argc,char* argv[])

{

//调用这个函数直接把24位真彩色灰度化

BOOL stat=BMP24to8("c://source.bmp","c://target.bmp");

return 0;

}

BOOL BMP24to8(char *szSourceFile,char *szTargetFile)

{

HANDLE hSourceFile=INVALID_HANDLE_VALUE,hTargetFile=INVALID_HANDLE_VALUE;

DWORD dwSourceSize=0,dwTargetSize=0;

PBYTE pSource=NULL,pTarget=NULL;

hSourceFile=CreateFile(szSourceFile,GENERIC_READ,FILE_SHARE_READ,NULL,

OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if(hSourceFile==INVALID_HANDLE_VALUE)

return FALSE;

dwSourceSize=GetFileSize(hSourceFile,NULL);

pSource=(PBYTE)VirtualAlloc(NULL,dwSourceSize,MEM_COMMIT,PAGE_READWRITE);

//分配空间失败或者文件太小(BMP文件不可能小于54个字节)

if(pSource==NULL||dwSourceSize<=54)

{

CloseHandle(hSourceFile);

return FALSE;

}

DWORD dwTemp=0;

ReadFile(hSourceFile,pSource,dwSourceSize,&dwTemp,NULL);

BITMAPFILEHEADER *pSourceFileHeader=(BITMAPFILEHEADER*)pSource; BITMAPINFOHEADER

*pSourceInfoHeader=(BITMAPINFOHEADER*)(pSource+sizeof(BITMAPFILEHEADER));

//不是BMP文件或者不是24位真彩色

if(pSourceFileHeader->bfType!=0x4d42||pSourceInfoHeader->biBitCount!=24)

{

CloseHandle(hSourceFile);

VirtualFree(pSource,NULL,MEM_RELEASE);

return FALSE;

}

CloseHandle(hSourceFile);

LONG nWidth=pSourceInfoHeader->biWidth;

LONG nHeight=pSourceInfoHeader->biHeight;

LONG nSourceWidth=nWidth*3;if(nSourceWidth%4) nSourceWidth=(nSourceWidth/4+1)*4;

LONG nTargetWidth=nWidth;if(nTargetWidth%4) nTargetWidth=(nTargetWidth/4+1)*4; dwTargetSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256 +nHeight*nTargetWidth;

pTarget=(PBYTE)VirtualAlloc(NULL,dwTargetSize,MEM_COMMIT,PAGE_READWRITE);

memset(pTarget,0,dwTargetSize);

if(pTarget==NULL)

{

VirtualFree(pTarget,NULL,MEM_RELEASE);

return FALSE;

}

BITMAPFILEHEADER *pTargetFileHeader=(BITMAPFILEHEADER *)pTarget; BITMAPINFOHEADER *pTargetInfoHeader =

(BITMAPINFOHEADER *)(pTarget+sizeof(BITMAPFILEHEADER));

pTargetFileHeader->bfType=pSourceFileHeader->bfType;

pTargetFileHeader->bfSize=dwTargetSize;

pTargetFileHeader->bfReserved1=0;

pTargetFileHeader->bfReserved2=0;

pTargetFileHeader->bfOffBits=sizeof(BITMAPFILEHEADER)

+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;

pTargetInfoHeader->biBitCount=8;

pTargetInfoHeader->biClrImportant=0;

pTargetInfoHeader->biClrUsed=256;

pTargetInfoHeader->biCompression=BI_RGB;

pTargetInfoHeader->biHeight=pSourceInfoHeader->biHeight;

pTargetInfoHeader->biPlanes=1;

pTargetInfoHeader->biSize=sizeof(BITMAPINFOHEADER);

pTargetInfoHeader->biSizeImage=nHeight*nTargetWidth;

pTargetInfoHeader->biWidth=pSourceInfoHeader->biWidth;

pTargetInfoHeader->biXPelsPerMeter=pSourceInfoHeader->biXPelsPerMeter; pTargetInfoHeader->biYPelsPerMeter=pSourceInfoHeader->biYPelsPerMeter; RGBQUAD *pRgb;

for(int i=0;i<256;i++)//初始化8位灰度图的调色板信息

{

pRgb = (RGBQUAD*)(pTarget+sizeof(BITMAPFILEHEADER)

+ sizeof(BITMAPINFOHEADER)+i*sizeof(RGBQUAD));

pRgb->rgbBlue=i;pRgb->rgbGreen=i;pRgb->rgbRed=i;pRgb->rgbReserved=0;

}

for (int m=0;m

{

for(int n=0;n

{

pTarget[pTargetFileHeader->bfOffBits+m*nTargetWidth+n] =

pSource[pSourceFileHeader->bfOffBits+m*nSourceWidth+n*3]*0.114

+pSource[pSourceFileHeader->bfOffBits+m*nSourceWidth+n*3+1]*0.587

+pSource[pSourceFileHeader->bfOffBits+m*nSourceWidth+n*3+2]*0.299; }

}

hTargetFile = CreateFile(szTargetFile,GENERIC_WRITE,FILE_SHARE_WRITE, NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

BOOL stat=WriteFile(hTargetFile,pTarget,dwTargetSize,&dwTemp,NULL); CloseHandle(hTargetFile);

VirtualFree(pSource,NULL,MEM_RELEASE);

VirtualFree(pTarget,NULL,MEM_RELEASE);

return stat;

}

转化效果如下图

在GDI+中将24位真彩色图转换为灰度图(原理、C#调用指针)

在图像处理中,我们经常需要将真彩色图像转换为黑白图像。严格的讲应该是灰度图,因为真正的黑白图像是二色,即只有纯黑,纯白二色。开始之前,我们先简单补充一下计算机中图像的表示原理。计算机中的图像大致可以分成两类:位图(Bitmap)和矢量图(Metafile)。位图可以视为一个二维的网格,整个图像就是由很多个点组成的,点的个数等于位图的宽乘以高。每个点被称为一个像素点,每个像素点有确定的颜色,当很多个像素合在一起时就形成了一幅完整的图像。我们通常使用的图像大部分都是位图,如数码相机拍摄的照片,都是位图。因为位图可以完美的表示图像的细节,能较好的还原图像的原景。但位图也有缺点:第一是体积比较大,所以人们开发了很多压缩图像格式来储存位图图像,目前应用最广的是JPEG格式,在WEB上得到了广泛应用,另外还有GIF,PNG 等等。第二是位图在放大时,不可避免的会出现“锯齿”现象,这也由位图的本质特点决定的。所以在现实中,我们还需要使用到另一种图像格式:矢量图。同位图不同,矢量图同位图的原理不同,矢量图是利用数学公式通过圆,线段等绘制出来的,所以不管如何放大都不会出现变形,但矢量图不能描述非常复杂的图像。所以矢量图都是用来描述图形图案,各种CAD软件等等都是使用矢量格式来保存文件的。

在讲解颜色转换之前,我们要先对位图的颜色表示方式做一了解。位图中通常是用RGB三色方式来表示颜色的(位数很少时要使用调色板)。所以每个像素采用不同的位数,就可以表示出不同数量的颜色。如下图所示:

每像素的位数一个像素可分配到的颜色数量

1 2^1 = 2

2 2^2 = 4

4 2^4 = 16

8 2^8 = 256

16 2^16 = 65,536

24 2^24 = 16,777,216

从中我们可以看出,当使用24位色(3个字节)时,我们可以得到1600多万种颜色,这已经非常丰富了,应该已接近人眼所能分辨的颜色了。现在计算机中使用最多的就是24位色,别外在GDI+中还有一种32位色,多出来的一个通道用来描述Alpha,即透明分量。

24位色中3个字节分别用来描述R,G,B三种颜色分量,我们看到这其中是没有亮度分量的,这是因为在RGB表示方式中,亮度也是直接可以从颜色分量中得到的,每一颜色分量值的范围都是从0到255, 某一颜色分量的值越大,就表示这一分量的亮度值越高,所以255表示最亮,0表示最暗。那么一个真彩色像素点转换为灰度图时它的亮度值应该是多少呢,首先我们想到的平均值,即将

R+G+B/3。但现实中我们使用的却是如下的公式:

Y = 0.299R+0.587G+0.114B

这个公式通常都被称为心理学灰度公式。这里面我们看到绿色分量所占比重最大。因为科学家发现使用上述公式进行转换时所得到的灰度图最接近人眼对灰度图的感觉。

因为灰度图中颜色数量一共只有256种(1个字节),所以转换后的图像我们通常保存为8位格式而不是24位格式,这样比较节省空间。而8位图像是使用调色板方式来保存颜色的。而不是直接保存颜色值。调色板中可以保存256颜色,所以可以正好可以将256种灰度颜色保存到调色版中。

代码如下:

using System;

using System.Collections.Generic;

using System.Text;

using System.Drawing;

using System.Drawing.Imaging;

namespace ConsoleApplication2

{

class Program

{

unsafe static void Main(string[] args)

{

Bitmap img = (Bitmap)Image.FromFile(@"E:/My Documents/My Pictures/cherry_blossom_1002.jpg");

Bitmap bit = new Bitmap(img.Width,

img.Height,PixelFormat.Format8bppIndexed);

BitmapData data

= img.LockBits(new Rectangle(0, 0, img.Width, img.Height),

ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb);

byte* bp = (byte*)data.Scan0.ToPointer();

BitmapData data2 =

bit.LockBits(new Rectangle(0, 0, bit.Width, bit.Height),

ImageLockMode.ReadWrite,PixelFormat.Format8bppIndexed);

byte* bp2 = (byte*)data2.Scan0.ToPointer();

for (int i = 0; i != data.Height; i++)

{

for (int j = 0; j != data.Width; j++)

{

//0.3R+0.59G+0.11B

float value = 0.11F * bp[i * data.Stride + j * 3]

+ 0.59F * bp[i * data.Stride + j * 3 + 1]

+ 0.3F * bp[i * data.Stride + j * 3 + 2];

bp2[i * data2.Stride + j] = (byte)value;

}

}

img.UnlockBits(data);

bit.UnlockBits(data2);

ColorPalette palette = bit.Palette;

for (int i = 0; i != palette.Entries.Length; i++)

{

palette.Entries[i] = Color.FromArgb(i, i, i);

}

bit.Palette = palette;

bit.Save(@"E:/TEMP/bb.jpeg", ImageFormat.Jpeg);

img.Dispose();

bit.Dispose();

}

}

}

代码中我使用了指针直接操作位图数据,同样的操作要比使用GetPixel, SetPixel快非常多。我们要感谢微软在C#中保留了特定情况下的指针操作。

图像效果如下:

C++代码处理24位图转8位图

代码处理对于宽度和高度都为基数的图形处理会产生形变!

核心部分代码如下:

////代码中m_sourcefile指24位真彩色图片的位置,m_targetfile是转换后的256色BMP灰度图保存的位置void CMy24Dlg::OnBtnConvert()

{

UpdateData();

if(m_sourcefile==""||m_targetfile=="")

return;

FILE *sourcefile,*targetfile;

//位图文件头和信息头

BITMAPFILEHEADER sourcefileheader,targetfileheader;

BITMAPINFOHEADER sourceinfoheader,targetinfoheader;

memset(&targetfileheader,0,sizeof(BITMAPFILEHEADER));

memset(&targetinfoheader,0,sizeof(BITMAPINFOHEADER));

sourcefile=fopen(m_sourcefile,"rb");

fread((void*)&sourcefileheader,1,sizeof(BITMAPFILEHEADER),sourcefile);//提取原图文件头if(sourcefileheader.bfType!=0x4d42)

{

fclose(sourcefile);

MessageBox("原图象不为BMP图象!");

return;

}

fread((void*)&sourceinfoheader,1,sizeof(BITMAPINFOHEADER),sourcefile);//提取文件信息头if(sourceinfoheader.biBitCount!=24)

{

fclose(sourcefile);

MessageBox("原图象不为24位真彩色!");

return;

}

if(sourceinfoheader.biCompression!=BI_RGB)

{

fclose(sourcefile);

MessageBox("原图象为压缩后的图象,本程序不处理压缩过的图象!");

return;

}

//构造灰度图的文件头

targetfileheader.bfOffBits=54+sizeof(RGBQUAD)*256;

targetfileheader.bfSize=targetfileheader.bfOffBits+sourceinfoheader.biSizeImage/3; targetfileheader.bfReserved1=0;

targetfileheader.bfReserved2=0;

targetfileheader.bfType=0x4d42;

//构造灰度图的信息头

targetinfoheader.biBitCount=8;

targetinfoheader.biSize=40;

targetinfoheader.biHeight=sourceinfoheader.biHeight;

targetinfoheader.biWidth=sourceinfoheader.biWidth;

targetinfoheader.biPlanes=1;

targetinfoheader.biCompression=BI_RGB;

targetinfoheader.biSizeImage=sourceinfoheader.biSizeImage/3; targetinfoheader.biXPelsPerMeter=sourceinfoheader.biXPelsPerMeter; targetinfoheader.biYPelsPerMeter=sourceinfoheader.biYPelsPerMeter; targetinfoheader.biClrImportant=0;

targetinfoheader.biClrUsed=256;

构造灰度图的调色版

RGBQUAD rgbquad[256];

int i,j,m,n,k;

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

{

rgbquad[i].rgbBlue=i;

rgbquad[i].rgbGreen=i;

rgbquad[i].rgbRed=i;

rgbquad[i].rgbReserved=0;

}

targetfile=fopen(m_targetfile,"wb");

//写入灰度图的文件头,信息头和调色板信息

fwrite((void*)&targetfileheader,1,sizeof(BITMAPFILEHEADER),targetfile);

fwrite((void*)&targetinfoheader,1,sizeof(BITMAPINFOHEADER),targetfile); fwrite((void*)&rgbquad,1,sizeof(RGBQUAD)*256,targetfile);

BYTE* sourcebuf;

BYTE* targetbuf;

//这里是因为BMP规定保存时长度和宽度必须是4的整数倍,如果不是则要补足m=(targetinfoheader.biWidth/4)*4;

if(m

m=m+4;

n=(targetinfoheader.biHeight/4)*4;

if(n

n=n+4;

sourcebuf=(BYTE*)malloc(m*n*3);

//读取原图的颜色矩阵信息

fread(sourcebuf,1,m*n*3,sourcefile);

fclose(sourcefile);

targetbuf=(BYTE*)malloc(m*n);

BYTE color[3];

通过原图颜色矩阵信息得到灰度图的矩阵信息

for(i=0;i

{

for(j=0;j

{

for(k=0; k<3; k++)

color[k]=sourcebuf[(i*m+j)*3+k];

targetbuf[(i*m)+j]=color[0]*0.114+color[1]*0.587+color[2]*0.299;

if(targetbuf[(i*m)+j]>255)

targetbuf[(i*m)+j]=255;

}

}

fwrite((void*)targetbuf,1,m*n+1,targetfile);

fclose(targetfile);

MessageBox("位图文件转换成功!");

}

24位真彩色和转换后的灰度图

上边的两组图就是用那段代码处理的结果

另外一种C++代码

BOOL Trans24To8(HDIB m_hDIB) {

//判断8位DIB是否为空

if(m_hDIB1!=NULL)

{

::GlobalUnlock((HGLOBAL)m_hDIB1);

::GlobalFree((HGLOBAL)m_hDIB1);

m_hDIB1=NULL;

}

BITMAPINFOHEADER* pBmpH; //指向信息头的指针

m_hDIB1=(HDIB)::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(BITMAPINFOHEADER)+768*576+256*sizeof(RGBQUAD));

lpDIB1=(LPSTR)::GlobalLock(m_hDIB1);

pBmpH=(BITMAPINFOHEADER*)(lpDIB1);

pImageBuffer=(unsigned char*)lpDIB1+40+256*4;

//指向8位DIB图象数据的指针

//写bmp信息头及bmp调色版

WriteBMPHeader(lpDIB1);

LPSTR lpDIB= (LPSTR) ::GlobalLock((HGLOBAL)m_hDIB);

//得到24位DIB的指针

int WidthDIB = (int) : IBWidth(lpDIB);

int HeightDIB= (int) : IBHeight(lpDIB);

LPSTR lp=::FindDIBBits(lpDIB);

unsigned char* l;

for (int j=0;j

{

for (int i=0;i

{

l=(unsigned char*)lp+(j*768+i)*3;

*pImageBuffer=(int)(((*l)*30+(*(l+1))*59+(*(l+2))*11)/100)

;

pImageBuffer++;

}

}

pImageBuffer-=768*576;

Invalidate(TRUE);//隐含调用OnDraw()函数绘图,即显示转化后的图象return TRUE;

}

void CBoKeDetectView::WriteBMPHeader(LPSTR &lpDIB)

{

//写bmp信息头

BITMAPINFOHEADER* pBmpInfoHeader;

pBmpInfoHeader=(BITMAPINFOHEADER*)lpDIB;

pBmpInfoHeader->biSize=sizeof(BITMAPINFOHEADER);

pBmpInfoHeader->biWidth=768;

pBmpInfoHeader->biHeight=576;

pBmpInfoHeader->biBitCount=8;

pBmpInfoHeader->biPlanes=1;

pBmpInfoHeader->biCompression=BI_RGB;

pBmpInfoHeader->biSizeImage=0;

pBmpInfoHeader->biXPelsPerMeter=0;

pBmpInfoHeader->biYPelsPerMeter=0;

pBmpInfoHeader->biClrUsed=0;

pBmpInfoHeader->biClrImportant=0;

//写bmp调色版

RGBQUAD* pRGB=(RGBQUAD*)(lpDIB+40);

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

{

pRGB.rgbBlue=pRGB.rgbGreen=pRGB.rgbRed=i;

pRGB.rgbReserved=0;

}

}

C#两种获取灰度图像的方法(24位转8位)

在图像处理程序开发中,常会遇到将一幅彩色图像转换成灰度图像的情况,笔者在最近的一个项目中便遇到了这点。经过一翻努力最终解决,想想有必要分享一下,于是便写下此文。在本文中,将向各位读者介绍两种实现这一变换的方法,这也是笔者先后使用的两种方法。本文的例子使用C#语言编写,使用的集成开发环境是Visual Studio 2005。

第一种,直接调用GetPixel/SetPixel方法。

我们都知道,图像在计算机中的存在形式是位图,也即一个矩形点阵,每一个点被称为一个像素。在这种方法中,我们通过GDI+中提供的GetPixel方法来读取像素的颜色,并加以计算,然后再使用SetPixel 方法将计算后的颜色值应用到相应的像素上去,这样便可以得到灰度图像。

上边提到的“计算”便是指得到灰度图像的计算,其公式是:

r = (像素点的红色分量 + 像素点的绿色分量 + 像素点的蓝色分量) / 3

最后得到的r便是需要应用到原像素点的值。具体的编程实现也非常的简单,只需要遍历位图的每一个像素点,然后使用SetPixel方法将上边计算得到的值应用回去即可。主要代码如下所示:

Color currentColor;

int r;

Bitmap currentBitmap = new Bitmap(picBox.Image);

Graphics g = Graphics.FromImage(currentBitmap);

for (int w = 0; w < currentBitmap.Width; w++)

{

for (int h = 0; h < currentBitmap.Height; h++)

{

currentColor = currentBitmap.GetPixel(w, h);

r = (currentColor.R + currentColor.G + currentColor.B) / 3;

currentBitmap.SetPixel(w, h, Color.FromArgb(r, r, r));

}

}

g.DrawImage(currentBitmap, 0, 0);

picBox.Image = currentBitmap;

g.Dispose();

以上代码非常简单,不需要做太多的解释。需要注意的是,在使用SetPixel方法的时候,其三色分量值均为我们公式计算得到的结果r。

另外一种写法

private void ToolStripMenuItemGrayR_Click(object sender, EventArgs e)

{

Bitmap b = new Bitmap(pictureBox1 .Image );//把图片框1中的图片给一个bitmap类型

Bitmap b1 = new Bitmap(pictureBox1.Image);

Color c = new Color();

//Graphics g1 = pictureBox1.CreateGraphics();//容器设为图片框1

for (int i = 0; i < pictureBox1.Image.Width ; i++)

for (int j = 0; j < pictureBox1.Image.Height; j++)

{

c = b1.GetPixel(i, j);

//用FromArgb方法由颜色分量值创建Color结构

Color c1 = Color.FromArgb(c.B, c.B, c.B);

b1.SetPixel(i, j, c1);

//pictureBox2.Image = b1;

//pictureBox2.Refresh();

}

pictureBox2.Image = b1;

pictureBox2.Refresh();

}

第二种,使用ColorMatrix 类

如果读者亲自测试过第一种方式,就会发现通过循环遍历位图所有像素,并使用SetPixel方法来修改每个像素的各颜色分量是非常耗时的。而现在介绍的第二种方法则是一种更好的实现方式――使用ColorMatrix类。

在介绍具体的实现之前,有必要先向读者介绍一下相关的背景知识。在GDI+中,颜色使用32位来保存,红色、绿色、蓝色和透明度分别占8位,因此每个分量可以有28=256(0~255)种取值。这样一来,一个颜色信息就可以用一个向量 (Red,Green,Blue,Alpha) 来表示,例如不透明的红色可以表示成为(255,0,0,255)。向量中的Alpha值用来表示颜色的透明度,0 表示完全透明,255 表示完全不透明。到这里读者朋友可能应该想到了,我们只需要按照一定的规则改变这些向量里各个分量的值,便可以得到各种各样的颜色变换效果,所以我们获得灰度图这个要求也就能够实现了。

现在关键问题便是按照什么规则来改变各分量值。在上边介绍的第一种方式中我们提到了计算灰度图像的公式,其实它还有另外一个表示方式,如下:

r = 像素点的红色分量×0.299 + 像素点的绿色分量×0.587 + 像素点的蓝色分量×0.114

这一公式便是我们的规则。我们只需要对每一个颜色向量做上边的变化即可。这里的变换就需要用到ColorMatrix类,此类定义在System.Drawing.Imaging名字空间中,它定义了一个5×5的数组,用来记录将和颜色向量进行乘法计算的值。ColorMatrix对象配合ImageAttributes类一起使用,实际上GDI+里的颜色变换就是通过ImageAttributes对象的SetColorMatrix 进行的。

第二种的主要实现代码如下:

Bitmap currentBitmap = new Bitmap(picBox.Image);

Graphics g = Graphics.FromImage(currentBitmap);

ImageAttributes ia = new ImageAttributes();

float[][] colorMatrix = {

new float[] {0.299f, 0.299f, 0.299f, 0, 0},

new float[] {0.587f, 0.587f, 0.587f, 0, 0},

new float[] {0.114f, 0.114f, 0.114f, 0, 0},

new float[] {0, 0, 0, 1, 0},

new float[] {0, 0, 0, 0, 1}};

ColorMatrix cm = new ColorMatrix(colorMatrix);

ia.SetColorMatrix(cm, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

g.DrawImage(currentBitmap, new Rectangle(0, 0, currentBitmap.Width, currentBitmap.Height), 0, 0, currentBitmap.Width, currentBitmap.Height, GraphicsUnit.Pixel, ia);

picBox.Image = currentBitmap;

g.Dispose();

细心的读者可能会问,明明颜色是由4个分量组成的,那么与之相乘的矩阵也应该是一个4×4的矩阵啊,为什么这里定义的颜色变换矩阵却是5×5的呢?这个问题可以参考MSDN上的一篇文章(《使用颜色矩阵对单色进行变换》)便可得解。

请读者朋友们输入以上代码并编译执行。大家会发现其变换速度极快,几乎是瞬间完成。其实,只要知道了矩阵各行、列必要的参数值,那么使用ColorMatrix来实现颜色变换是非常方便的。诸如让某色透明这样的功能用这种方式实现起来也是非常方便高效的。

上边简要地介绍了两种获得灰度图像的方法。在实际开发中,使用第二种方式远远优于第一种,其在运算速度方面的优势,是第一种远远没法比的。

ColorMatrix 类(.NET Framework 4 )

.NET Framework 3.5

?.NET Framework 3.0

?.NET Framework 2.0

定义包含 RGBAW 空间坐标的 5 x 5 矩阵。ImageAttributes类的若干方法通过使用颜色矩阵调整图像颜色。无法继承此类。

命名空间:System.Drawing.Imaging

程序集: System.Drawing(在 System.Drawing.dll 中)

图像灰度变换实验报告

图像灰度变换报告 一.实验目的 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; 使

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('原始图像直方图') %在原图直方图上加标题运行结果如下:

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

成绩评定表

课程设计任务书

摘要 空域增强在数字图像处理中起到对图像灰度的拉伸、压缩变换的作用,目前这种方法在处理图像灰度值方面得到广泛的运用。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)

精雕JDPaint快捷键大全

北京精雕快捷键表格

选择工具下的快捷键 1、文件 Ctrl+O:打开Ctrl+S:保存Ctrl+N:新建Ctrl+Z:返回2、视图F4:旋转观察F5:窗口观察F6:全部观察F7:选择观察F8:上次观察F12:全屏观察

Ctrl+R:重画 Ctrl+E:自动导行Ctrl+D:正交捕捉3、绘制 Ctrl+Q:直线 Ctrl+P:样条 Ctrl+L:圆 Ctrl+A:圆弧 Ctrl+W:多义线Ctrl+T:矩形 4、编辑 Ctrl+Y:重做 Ctrl+C:复制 Ctrl+X:剪切 Ctrl+V:粘贴 Ctrl+1:区域等距Ctrl+2:区域连接Ctrl+3:区域焊接Ctrl+4:区域求交Ctrl+5:单线等距Ctrl+6:连接 Ctrl+7:修剪 Ctrl+8:剪切 Ctrl+9:延伸 DEL:删除 5、变换 Alt+1:平移 Alt+2:旋转 Alt+3:镜像 Alt+4:缩放 Alt+F2:集合 Alt+F3:取消集合Ctrl+6:并入3D环境 虚拟雕塑工具下的快捷键 1、文件 Ctrl+O:打开Ctrl+S:保存Ctrl+N:新建Ctrl+Z:返回3、视图 F4:旋转观察F5:窗口观察 F6:全部观察 F7:选择观察 F8:上次观察 F12:全屏观察Ctrl+R:重画 Ctrl+E:自动导行

Ctrl+D:正交捕捉4、绘制 Ctrl+Q:直线 Ctrl+P:样条 Ctrl+L:圆 Ctrl+A:圆弧 Ctrl+W:多义线Ctrl+T:矩形 5、编辑 Ctrl+Y:重做 Ctrl+C:复制 Ctrl+X:剪切 Ctrl+V:粘贴 Ctrl+1:区域等距Ctrl+2:区域连接Ctrl+3:区域焊接Ctrl+4:区域求交Ctrl+5:单线等距Ctrl+6:连接 Ctrl+7:修剪 Ctrl+8:剪切 Ctrl+9:延伸DEL:删除 6、变换 Alt+1:平移 Alt+2:旋转 Alt+3:镜像Alt+4:缩放 Alt+F2:集合 Alt+F3:取消集合 Ctrl+6:并入3D环境 7、橡皮 Shift+T:擦除 Shift+G:整体固化 8、几何 Alt+X:扫掠面 Alt+Z:单线浮雕 Alt+Q:延伸面 9、导动 Shift+A:导动堆料 Shift+S:导动去料 Shift+J:导动磨光 Shift+I:消除锯齿 Shift+L:特征磨光 10、颜色 Shift+O:涂抹颜色 Shift+X:种子填色 Shift+V:等高填色 Shift+Z:单线填色 Shift+C:区域填色 Shift+L:颜色区域矢量化11、效果 Shift+E:磨光 12、选项

实验一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);

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

实验三图像增强—灰度变换 一、实验目的: 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

精雕软件简单教程

精雕软件简单教程 发布:2014-05-22 ?阅读:459 您的雕刻机软件会操作了吗,慢慢学习吧,泽凯数控设备有限公司帮助您 在数控雕刻机使用过程中,精雕、文泰、type3、ug等软件是客户必须用的,只不过客户根据自己的习惯会选用不同的设计软件。其中精雕是目前使用率比较广泛的设计软件之一,它能很轻松的完成各种浮雕的雕刻路径设置。但对于很多初学者,精雕还是比较难的,因为更多人不知道如何入门。我们简单介绍一下精雕的如何教程。 解压后无需安装,将JDPait和NCservert创建快捷方式托至桌面 1. 运行雕刻机精雕软件(JDPaint)之前先运行NC路径转换器(NCserver) 2.打开精雕软件 3. 输入图片 点击【文件】——【输入】——【点阵图像】——找到要刻的灰度图(一般为bmp格式)——打开 4.调整图片大小 选中图片——点击【变换】——【放缩】——设置合适的尺寸——确定 ? 5.生成浮雕曲面 点击【艺术曲面】——【图像纹理】——【位图转成网格】——点击图片——设置合适的曲面高度 向变换 将图片拖至其他位置与网格分离——选中网格——点击【虚拟雕塑工具】——点击【模型】——Z向变换——点击将高点移至XOY平面

7.做路径 点击【选择工具】——选中网格——点击【刀具路径】——【路径向导】——选择曲面精雕刻——下一步——选择合适的刀具(刀具库中没有的刀具可以双击其中一把刀具将其参数修改后确定)——下一步(使用维宏控制系统的无需选材料)——将雕刻机雕刻路径参数中的路径间距重新设置(一般将重叠率调至20%-35%)——完成 8.输出路径 拉框选中已经做好的路径——点击【刀具路径】——输出刀具路径——找到要保存的位置并命名后点击保存———ENG文件格式选择,输出原点处点击【特征点】选择路径左下角——确定——将NC路径转换器的文件头尾设置全部清空——点击【生成】 ? 9.将做好的NC文件导入雕刻机控制系统(维宏控制)按照维宏控制操作说明进行操作即可完成雕刻。

用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)

图像灰度变换增强

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

matlab图像的灰度变换

实验二 图像的灰度变换 一、实验目的 1、 理解数字图像处理中点运算的基本作用; 2、 掌握对比度调整与灰度直方图均衡化的方法。 二、实验原理 1、对比度调整 如果原图像f (x , y )的灰度范围是[m , M ],我们希望对图像的灰度范围进行线性调整,调整后的图像g (x , y )的灰度范围是[n , N ],那么下述变换: []n m y x f m M n N y x g +---=),(),(就可以实现这一要求。 MATLAB 图像处理工具箱中提供的imadjust 函数,可以实现上述的线性变换对比度调整。imadjust 函数的语法格式为: J = imadjust(I,[low_in high_in], [low_out high_out]) J = imadjust(I, [low_in high_in], [low_out high_out])返回原图像I 经过直方图调整后的新图像J ,[low_in high_in]为原图像中要变换的灰度范围,[low_out high_out]指定了变换后的灰度范围,灰度范围可以用 [ ] 空矩阵表示默认范围,默认值为[0, 1]。 不使用imadjust 函数,利用matlab 语言直接编程也很容易实现灰度图像的对比度调整。但运算的过程中应当注意以下问题,由于我们读出的图像数据一般是uint8型,而在MATLAB 的矩阵运算中要求所有的运算变量为double 型(双精度型)。因此读出的图像数据不能直接进行运算,必须将图像数据转换成双精度型数据。 2、直方图均衡化 直方图均衡化的目的是将原始图像的直方图变为均衡分布的形式,即将一已知灰度概率密度分布的图像,经过某种变换变成一幅具有均匀灰度概率密度分布的新图像,从而改善图像的灰度层次。 MATLAB 图像处理工具箱中提供的histeq 函数,可以实现直方图的均衡化。 三、实验内容及要求 1、 用MATLAB 在自建的文件夹中建立example2.m 程序文件。在这个文件的程序中,将girl2.bmp 图像文件读出,显示它的图像及灰度直方图(可以发现其灰度值集中在一段区

图像处理灰度变换实验

一. 实验名称:空间图像增强(一) 一.实验目的 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 。

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

数字图像处理实验报告 (一) 班级:测控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

数字图像处理图像变换实验报告

数字图像处理图像变换实验 报告 -标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

实验报告实验名称:图像处理 姓名:刘强 班级:电信1102 学号:1404110128

实验一图像变换实验——图像点运算、几何变换及正交变换一、实验条件 PC机数字图像处理实验教学软件大量样图 二、实验目的 1、学习使用“数字图像处理实验教学软件系统”,能够进行图像处理方面的 简单操作; 2、熟悉图像点运算、几何变换及正交变换的基本原理,了解编程实现的 具体步骤; 3、观察图像的灰度直方图,明确直方图的作用和意义; 4、观察图像点运算和几何变换的结果,比较不同参数条件下的变换效 果; 5、观察图像正交变换的结果,明确图像的空间频率分布情况。 三、实验原理 1、图像灰度直方图、点运算和几何变换的基本原理及编程实现步骤 图像灰度直方图是数字图像处理中一个最简单、最有用的工具,它描述了一幅图像的灰度分布情况,为图像的相关处理操作提供了基本信息。 图像点运算是一种简单而重要的处理技术,它能让用户改变图像数据占据的灰度范围。点运算可以看作是“从象素到象素”的复制操作,而这种复制操作是通过灰度变换函数实现的。如果输入图像为A(x,y),输出图像为B(x,y),则点运算可以表示为: B(x,y)=f[A(x,y)] 其中f(x)被称为灰度变换(Gray Scale Transformation,GST)函数,它描述了输入灰度值和输出灰度值之间的转换关系。一旦灰度变换函数确定,该点运算就完全确定下来了。另外,点运算处理将改变图像的灰度直方图分布。点运算又被称为对比度增强、对比度拉伸或灰度变换。点运算一般包括灰度的线性变换、阈值变换、窗口变换、灰度拉伸和均衡等。 图像几何变换是图像的一种基本变换,通常包括图像镜像变换、图像转置、图像平移、图像缩放和图像旋转等,其理论基础主要是一些矩阵运算,详细原理可以参考有关书籍。 实验系统提供了图像灰度直方图、点运算和几何变换相关内容的文字说明,用户在操作过程中可以参考。下面以图像点运算中的阈值变换为例给出编程实现的程序流程图,如下:

灰度图转浮雕

灰度图转浮雕简易处理步骤 灰度图转浮雕简易处理过程(入门) 发这个贴,算是给新人和自己上个小课吧。当是无脑输出。 刚好给客户完成一张抽屉面的图,规格为61*395.就以此为例吧。原图如下: 第一步:打开精雕软件,文件-输入-点阵图像-选择指定图像(注意文件 类型)〈图1〉 第二步:绘制所需尺寸图形,绘制-矩形(随意画个)-选中矩形-变换- 放缩(输入395*61);编辑-单线等距-选中矩形向内偏移4MM(起外框线条)-'绘制,矩形'以内框左上角为起点按住SHIFT拉伸差不多8MM左右放手〈图21〉-'编辑修剪'点选内框和小矩形-右键确认,左键修剪掉内框左上角线条-'编辑,倒圆角'-输入半径5右键(注意左右下角)-右键确认上圆角<图22>;给外框上中心线修剪掉内框除左上角部分的其它三部分〈图23〉-点选左上角部分‘变换镜像’以为中心线为轴对称(注意右上角选复制图形)-‘编辑,连接’内框-‘单线等距’向外偏移4MM;点选灰度图按住SHIFT移动图像到方框内并放缩至合适位置(尽量别去让图像变形;小技巧:拉伸时按住CTRL同时两边 拉伸)〈图24〉。

第三步:灰度转浮雕,艺术曲面-图像处理-位图转网格(注意左下角出现: 点选一位图)-点击图像-弹出窗口输入需要的曲面高度(我这里为3.5MM);右向左框选曲面按6进入‘虚拟雕塑环境’F6‘全局观察’-‘雕塑,冲压’去掉外框线 条〈图32〉。

第四步(重要部分,个人技巧):完善灰度图转浮雕,去掉中心线-‘颜色, 等高填色’(注意右上角,如图41设置)-点击浮雕(如图42效果)-再次在龙头外线点击(龙头明显还有水纹,直到把多余水纹填色掉,如图43)-‘颜色,颜色区域矢量化’生成外框线(小技巧:这个还有另外一个快捷键是/)-‘效果,磨光’多磨几次直到表面光滑,当然图像不能模糊了;接下来这个步骤很重要雕出来好不好看就看这了,‘冲压’右边选颜色内,SHIFT+左键拾取填充的颜色-左键冲压闭合区域(图中有三个位置注意了)-如是正版5.5支持‘特征,削除锯 齿’加以应用下,定更接近美感。

利用基本灰度变换对图像进行增强

3 利用基本灰度变换对图像进行增强 灰度变换原理:灰度变换是一种空域处理方法,其本质是按一定的规则修改每个像素的灰度,从而改变图像的动态范围实现期望的增强效果。灰度变换按映射函数可分为线性、分段线性和非线性等多种形式。 3.1 线性灰度变换 线性灰度变换是将输入图像灰度值的动态范围按线性关系公式拉伸扩展至指定范围或整个动态范围。可突出感兴趣目标,抑制不感兴趣的目标。在实际运算中,原图像f(x,y)的灰度范围为[a,b],使变换后图像g(x,y)的灰度扩展为[c,d],则采用下述线性变换来实现: c a y x f a b c d y x g +---=]),([),( 线性灰度变换对图像每个灰度范围作线性拉伸,将有效地改善图像视觉效果。 源代码如下: 1、利用灰度调整函数变换图像 A=imread('e:\7.tif','tif'); %读入图像 B=imadjust(A,[0.1,0.8],[0,1]); %灰度调整 imwrite(B,'E:\ 1.tif'); %图像保存 subplot(2,2,1);imshow(A); %显示调整前后图像及其直方图 subplot(2,2,2);imhist(A); subplot(2,2,3);imshow(B); subplot(2,2,4);imhist(B);

0100200 500 1000 0100200 500 1000 2、利用灰度调整算法变换图像 clear; a=60; %图像变换参数设定 b=180; c=0; d=255; A=imread('pout.tif','tif'); %读入图像 [m,n]=size(A); A=double(A); for i=1:1:m %灰度调整 for j=1:1:n if (A(i,j)>=a)&(A(i,j)

精雕灰度图转浮雕的做法

精雕灰度图转浮雕的做法: 首先打开精雕作图软件如图,打开之后点击屏幕左上方的“文件”如图 ,找到目录下的“输入”然后找到“点阵图像”单击文件类型选择(*.bmp),找到 所需要加工的图打开,如:打开之后看一下图的尺寸是否是你需要加工的尺寸,如果不是那就需要修改一下图的加工尺寸 首先选中图片,单击屏幕左上方的“变换”,找到目录下的“放缩”(快捷键Alt+4),如图

假如雕刻尺寸是200X200 (MM)只要修改横向尺寸为200,点一下“保持比例”就可以了,纵向尺寸就自动变到200, 如果你雕刻的尺寸是不规则的,比如是200X100(mm)那就横向尺寸改到200,纵向尺寸改成100,这次不需 要点击“保持比例”,尺寸修改完之后,点击屏幕中心上方的“艺术曲面”,找到目录下的“图像纹理”——单击“位图转网格”,这是把鼠标放到图片上点击一下会出现如图:

需要修改一下你的加工工件的雕刻深度如图: 如果雕刻是3毫米,输入3就可以了,然后点击

“确定”,出现如图出现一个网格,这个网格就是我们用灰度图转出来的浮雕图,然后我们把灰度图移开或是删除,现在我们开始绘制一个矩形,单击屏幕左上方的“绘制”,找到目录下的“矩形”(Ctrl+T)点击,找到空白处单击鼠标左键,移动鼠标出现矩形再次点击鼠标左键,就绘制出一个矩形,然后单击鼠标右键退出,选中矩形单击“变换”目录下的——“尺寸等同”,这是用鼠标左键单 击以下网格出现如图:选择双向尺寸等同之后点击确定,此时矩形和网格一样大,然后再单击屏幕右侧工具栏的“对齐”,找到目录 下的如图:点击,现在用鼠标左键单击网格出现如下图:

灰度变换.

陕西科技大学实验报告 班级:信息071班学号:200712030121姓名仝颖超实验组别: ________ 实验日期:_____________ 报告日期:________________ 成绩:________________ 实验灰度线性变换 一.实验目的 1、掌握matlab编程语言进行编程。 2、用matlab及运用各种数字图像处理方法实现对图像的变换。 二.实验设备 计算机、Matlab软件 三.实验原理 曝光不足或过度的情况下,图像灰度可能会局限在一个很小的范围内。这时在显示器上看到的是一个模糊不清似乎没有灰度层次的图像。用一个线性单值函数,对每一个像素作扩展变换(线性),将会有效地改变图像视觉效果。 四.实验步骤 对图像灰度线性变换 五.源程序清单、测试数据、结果 图像灰度变换是图像增强的一种手段。其中灰度非线性变换能使图像灰度的分布均匀,与人的视觉特性相匹配。MATLAB语言编写的例程和图像运行结果如下: %读入并显示原始图像 l=imread('d:\1.JPG'); Imshow(l); I=double(I); [M,N]=size(l); %进行灰度变换 for i=1:M for j=1:N if I(i,j)<=30 I(i,j)=I(i,j); elseif I(i,j)<=150 l(i,j)=(200-30)/(150-30)*(l(i,j)-30)+30; else I(i,j)=(255-200)/(255-150)*(I(i,j)-150)+200; end end end %变换后的结果 figure(2); imshow(ui nt8(l));

三种不同灰度图像增强算法对比

三种不同灰度图像增强算法对比 一、摘要 本文主要是运用直方图均衡化、平滑、锐化三种常见的图像增强算法对图像进行处理,并在此基础上分别用这 3 种算法处理的灰度图像进行比较,比对它们对图像的处理效果, 分析3 种方法在图像增强处理能力的优劣之处。 结果发现,直方图均衡化可以均衡图像的灰度等级, 经过直方图的均衡化,图像的细节更加清楚了,但是由于直方图均衡化没有考虑图像的内容,只是简单的将图像进行直方图均衡,提高图像的对比度,使图像看起来亮度过高,使图像细节受到损失; 图像平滑的目的是减少或消除图像的噪声, 图像平滑可以使图像突兀的地方变得不明显, 但是会使图像模糊,这也是图像平滑后不可避免的后果,只能尽量减轻,尽量的平滑掉图像的噪声又尽量保持图像细节,这也是图像平滑研究的主要问题; 图像锐化使图像的边缘、轮廓变得清晰,并使其细节清晰,常对图像进行微分处理,但是图像的信噪比有所下降。 关键词: 图像增强灰度图直方图平滑锐化 二、三种图像增强算法 图像预处理是相对图像识别、图像理解而言的一种前期处理,主要是指按需要进行适当的变换突出某些有用的信息,去除或削弱无用的信息,在对图像进行分析之前, 通常要对图像质量进行改善,改善的目的就是要使处理后的图像比原始图像更适合特定的应用。影响图像清晰度的因素很多,主要有光照不足、线路传输收到干扰等。 现存的图像增强技术主要分为空间域法和频率域法两类,其中的增强方法主要有直方图的修正、灰度变换、图像平滑、图像锐化、伪彩色和假彩色处理等。下面主要采用直方图均衡化、图像平滑、图像线性锐化对图像进行增强处理, 对比他们的处理效果,分析 3 种方法的在图像增强处理方面的优劣。 1、直方图均衡化 直方图均衡化也称为直方图均匀化,是一种常见的灰度增强算法,是将原图像的直方图经过变换函数修整为均匀直方图,然后按均衡后的直方图修整原图像。 为方便研究,先将直方图归一化,然后图像增强变换函数需要满足2个条件。 假设灰度级为归一化至范围[0,1]内的连续量,设其中任一灰度级别Z归一化为r,变换后图像的任一灰度级Z'归一化为s,显然r,s应当满足:0<=r<=1,0<=s<=1 因此直方图修正就是对下列公式的计算过程:s=T(r)或r=T'(s) 式中T(r)为变换函数,它必须满足下列条件: a在0<=r<=1区间内是单值单调增加函数; b对于0<=r<=1,有T(r)在[0,1]内。 条件a 保证灰度级从黑到白的次序,而条件b确保映射后的像素灰度在允许的范围内,避免整个图像明显变亮或者变暗。 从S 到r的反变换关系为r=T'(s) ;T'(s)对r同样满足上述条件。 灰度变换是对图像上各个像素点的灰度值x 按某个函数T 变换到y ,将图像的灰度级整个范围或其中某一段( A, B)扩展或压缩到( A, B)。直方图均衡化是灰度变换的一个重要应用,是以累计分布函数变换为基础的直方图修正法, 可以产生一幅灰度级分布具有均匀概率密度的图像。一幅图像灰度级r k 出现的概率近似为 其中n 是图像中像素的总和, nk 是灰度级为r k 的像素个数, L 为图像中灰度级总数。若

图像灰度变换

数字图像处理—实验一 一.实验内容: 图像灰度变换 二.实验目的: 学会用Matlab 软件对图像灰度进行变换;感受各种不同的灰度变换方法对最终图像效果的影响。 三.实验步骤: 1.获取实验用图像:Fig3.jpg. 使用imread 函数将图像读入Matlab 。 2.产生灰度变换函数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对原图像Fig3.10(b).jpg 进行处理,打印处理后的新图像。 3.产生灰度变换函数T2,使得: s = 用T2对原图像Fig3.jpg 进行处理,打印另一处理后的新图像。 4.分别用 s = r 0.6; s = r 0.4; s = r 0.3 对Fig3.08(a).jpg 图像进行处理。为简便起见,请使用Matlab 中的imadjust 函数。 5.对Fig3.jpg 图像实施反变换(Negative Transformation )。s =1-r; 6.对Fig3.jpg 图像实施灰度切片(Gray-level slicing )。具体要求如下: 当0.2 ≤ r ≤ 0.4时,将r 置为0.6, 当r 位于其他区间时, 保持其灰度与原图像一样。 四.实验报告要求: 用imshow, plot 等函数生成各类图像,提交原图像和各种变换函数的曲线,以及按各种变换函数处理后的图像。实验报告上的其他内容,按常规实验报告要求办。 程序:

figure; subplot(4,3,1); i=imread('Fig3.jpg'); i=im2double(i); imshow(i);title('1'); %2 subplot(4,3,2); r=[0:0.001:1]; s=[r<0.35].*r*0.3+[r<=0.65].*[r>=0.35].*(0.105+2.6333*(r-0.35))+[r>0.65 ].*(1+0.3*(r-1)); plot(r,s);title('2p,'); subplot(4,3,3); T1=[i<0.35].*i*0.3+[i<=0.65].*[i>=0.35].*(0.105+2.6333*(i-0.35))+[i>0.6 5].*(1+0.3*(i-1)); imshow(T1);title('2i,'); imwrite(T1,'Fig3.10(b)_T1.jpg','jpg'); %3 subplot(4,3,4); r=[0:0.001:1]; s=[r<=0.5].*(r.^5)*15.9744+[r>0.5].*((r-0.5).^0.2+0.12); plot(r,s);title('3p,'); subplot(4,3,5); T2=[i<=0.5].*(i.^5)*15.9744+[i>0.5].*((i-0.5).^0.2+0.12); imshow(T2);title('3i,'); imwrite(T2,'Fig3.10(b)_T2.jpg','jpg'); %4 subplot(4,3,6); ss1=r.^0.6; ss2=r.^0.4; ss3=r.^0.2; plot(r,ss1,r,ss2,r,ss3);title('4p,'); subplot(4,3,7); s1=imadjust(i,[],[],0.6); imshow(s1);title('41i,'); subplot(4,3,8); s2=imadjust(i,[],[],0.4); imshow(s2);title('42i,'); subplot(4,3,9); s3=imadjust(i,[],[],0.3); imshow(s3);title('43i,');

相关主题
文本预览
相关文档 最新文档