24位真彩色转换为8位灰度图_VC++_代码

24位真彩色转换为8位灰度图_VC++_代码
24位真彩色转换为8位灰度图_VC++_代码

24位真彩色转换为8位灰度图

//

////////////////////////////////////////////////////////////////////////

#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=INV ALID_HANDLE_V ALUE,hTargetFile=INV ALID_HANDL E_V ALUE;

DWORD dwSourceSize=0,dwTargetSize=0;

PBYTE pSource=NULL,pTarget=NULL;

hSourceFile=CreateFile(szSourceFile,GENERIC_READ,FILE_SHARE_REA D,NULL,

OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if(hSourceFile==INV ALID_HANDLE_V ALUE)

return FALSE;

dwSourceSize=GetFileSize(hSourceFile,NULL);

pSource=(PBYTE)VirtualAlloc(NULL,dwSourceSize,MEM_COMMIT,PAG E_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(BITMAPF ILEHEADER));

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

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

{

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(BITMAPINFOHEAD ER)+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三色方式来表示颜色的(位数很少时要使用调色板)。所以每个像素采用不同的位数,就可以表示出不同数量的颜色。如下图所示:

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

12^1 = 2

22^2 = 4

42^4 = 16

82^8 = 256

162^16 = 65,536

242^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图象!");

}

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.biSizeIma ge/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];

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

语法

public sealed class ColorMatrix

备注

矩阵系数组成一个5 x 5的线性转换,用于转换ARGB单色值。例如,ARGB向量表示为Alpha、Red(红色)、Green(绿色)、Blue(蓝色)和W,此处W始终为1。

例如,假设您希望从颜色(0.2, 0.0, 0.4, 1.0)开始并应用下面的变换:

1将红色分量乘以2。

2将0.2添加到红色、绿色和蓝色分量中。

下面的矩阵乘法将按照列出的顺序进行这对变换。

颜色矩阵的元素按照先行后列(从0开始)的顺序进行索引。例如,矩阵M的第五行第三列由M[4][2]表示。

5×5单位矩阵(在下面的插图中显示)在对角线上为1,在其他任何地方为0。如果用单位矩阵乘以颜色矢量,则颜色矢量不会发生改变。形成颜色变换矩阵的一种简便方法是从单位矩阵开始,然后进行较小的改动以产生所需的变换。

有关矩阵和变换的更详细的讨论,请参见坐标系统和变形。

示例

下面的示例采用一个使用一种颜色(0.2, 0.0, 0.4, 1.0)的图像,并应用上一段中描述的变换。下面的插图在左侧显示原来的图像,在右侧显示变换后的图像。

下面示例中的代码使用以下步骤进行重新着色:

3初始化ColorMatrix对象。

4创建一个ImageAttributes对象,并将ColorMatrix对象传递给ImageAttributes对象的SetColorMatrix方法。

5将ImageAttributes对象传递给Graphics对象的DrawImage方法。

前面的示例是为使用Windows窗体而设计的,它需要Paint事件处理程序的参数PaintEventArgs e。

复制

Image image = new Bitmap("InputColor.bmp");

ImageAttributes imageAttributes = new ImageAttributes();

int width = image.Width;

int height = image.Height;

float[][] colorMatrixElements = {

new float[] {2, 0, 0, 0, 0}, // red scaling factor of 2

new float[] {0, 1, 0, 0, 0}, // green scaling factor of 1 new float[] {0, 0, 1, 0, 0}, // blue scaling factor of 1

new float[] {0, 0, 0, 1, 0}, // alpha scaling factor of 1 new float[] {.2f, .2f, .2f, 0, 1}}; // three translations of 0.2

ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);

imageAttributes.SetColorMatrix(

colorMatrix,

ColorMatrixFlag.Default,

ColorAdjustType.Bitmap);

e.Graphics.DrawImage(image, 10, 10);

e.Graphics.DrawImage(

image,

new Rectangle(120, 10, width, height), // destination rectangle 0, 0, // upper-left corner of source rectangle

width, // width of source rectangle

height, // height of source rectangle

GraphicsUnit.Pixel,

imageAttributes);

halcon知识点

1. 无论读入什么图像,读入图像显示效果明显和原始图像不一致,哪怕是从相机读入的图像,也是明显颜色差异。什么原因引起? 初步诊断是,显示的时候调用的颜色查找表存在异常不是 default ,而是其它选项。此时可以通过查阅相关参数,调用set_system解决,也可以在编辑-》参数选择-》颜色查找表进行更改。 2. 裁剪图像;从图像上截取某段图像进行保存。如何实现该操作? 首先应该知道,region不具有单独构成图像的要素,他没有灰度值。有用过opencv的应该知道 ROI(感兴趣区域),设置好它后,对图像的大部分操作就转为图像的一个矩形区域内进行。类似的,halcon有domain 概念。首先设置好一个矩形区,然后使用 reduce_domain(是一个矩形区域)后,再使用crop_domain 就裁剪出图像。 3. 读入bmp,或tiff 图像显示该图不是bmp文件或不能读。原因是什么? 这个常有新手询问,画图,图像管理器都能打开,又或者是相机采集完直接存到硬盘。Halcon 读取图像在windows下面到最后是调用windows库函数实现读图功能。咱不清楚到底是怎么调用的。对于图像格式,在读图函数F1说明很细。基本 bmp 如果文件头不是bw还是bm(百度百科bmp格式查找,编写此处时无网络,后续可能忘记),就读不进来。其他规格欢迎补充。解决办法,如果是相机采集,就在内存直接转换(参见 halcon到VC.pdf 里面的halcon和bitmap互转);如果是采完的图片,大部分通过画图工具转换为 24位bmp格式,即可解决。 4.读入avi文件报错。

Halcon 通过 directshow或另一个格式解析视频,正常来说应该可以读入市面大部分视频,实际测试发现只能读入最标准的avi文件格式。如果需要临时处理,需要下格式工厂等工具转化为最标准的avi文件格式(论坛叶诺有发帖说明)。 5. Region 或 xld 筛选。 Halcon提供了丰富的region 和xld筛选方法。Region可以使用select_shape_xld,选择出符合要求的区域,如果不能满足还可以通过类似 region feature 这样关键字组合成的算子获取区域特征,然后通过 tuple 排序或相加减,再通过 tuple_find 确定是对应哪个区域的特征。同样的halcon也提供了 select_contours_xld 进行轮廓筛选。 6. Halcon分几类对象,每个类的功用是? Halcon总分俩大类,tuple和图标对象obj 。Tuple涵盖了对所有基础数据类型的封装,可以理解为她是halcon定义的数组类。Obj 是alcon定义图标类基类。衍生出了许多类型,其中 Region ,Xld,Image 其中最主要的类型。 7. F1说明,参数部分 -array 是什么意思? 该符号说明,该参数接受一组输入,对tuple就是一组tuple,对obj 就是通过concat_obj 或其它操作产生的一组obj元组。 8. 俩个相对方形物体的距离计算。 如果这俩个物体和背景对比清晰,最近的距离在俩条边下则可以再预处理之后进行如下操作:

精雕实训报告

精雕实训报告

精工实习报告 学院:西安科技大学高新学院 专业班级:工业设计0901 姓名:周书剑 学号:0906130116 指导老师:何瑶 实习时间:2012年4月9日——2012年4月22日实习地点:西安科技大学高新学院精雕机房。 实习内容:使用精雕软件制作灰度图和使用精雕机 2012年4月9日,我们开始了为期10天的精工实习,这次我们实习的内容是掌握精雕软件制作灰度图和使用精雕机加工精雕。实习开始时,我们认识了教我们使用精雕软件、使用精雕机的吴老师以及管理我们行程的马老师。刚进入精雕机房时,我们对一切还不是很熟悉,在吴老师的讲解下,我们知道了精雕加工是一种金工工艺,学习它不仅可

在灰度图制作完成后,我们开始使用精雕机制作加工,教我们的老师很有经验,先由简单的机床操作开始:开关机、摇手轮、装拆刀、对刀,到现在的画图、编刀路。我们可以自由操作机床,也可以随便到别的小组向同学请教,老师对我们的学习进程要求很严格,摇手轮 测试必须一分钟完成。装拆刀也只给我们1分30秒。刚开始我们练习完成时,都用了老师要求的好几倍的时间,经过半天的练习,我们基本都通过老师的测试。那时我们特别兴奋,感觉这不只是我们实习的地方,更是开发我们潜力的地方。精雕机:顾名思义。就是可以精确雕、也可铣,雕刻机的基础上加大了主轴、伺服电机功率,床身承受力,同时保持主轴的高速,更重要的是精度很高。 一个多星期过去了,我接触最多的是数控编程这一块,现在我们每天操机、编程,在加工过程中不断摸索、总结。也因为自己的总结所以才会有更多的收获,刚开始编一个程序需要2个小时,现

在只要半个小时就完成了。为期两周的机电设备拆装实习转眼就结束了,但是带给我的感受却永远的留在了我的心。总的来说,这次为期两周的实习活动是一次有趣的,且必给了我今后的学习工作上的重要的经验。在以后的时间里也恐怕不会再有这样的机会去让我们去体验这样 的生活,也恐怕难有这样的幸运去体验身边的每一样东西到底是如何制造出来的了。 随着科学的迅猛发展,新技术的广泛应用,会有很多领域是 我们未曾接触过的,只有敢于去尝试才能有所突破,有所创新。就像我们接触到的加工中心、车床,虽然它的危险性很大,但是要求每个同学都要去操作而且要加工出产品,这样就锻炼了大家敢于尝试的勇气。数控加工实习带给我们的,不全是我们所接触到的那些操作技能,也不仅仅是通过几项工种所要求我们锻炼的几种能力,更多的则需要我们每个人在实习结束后根据自己的情况去感悟,去

精雕软件简单教程

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

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

精雕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、选项

halcon基础数据类型详解

halcon基础数据类型详解 #if defined(__CHAR_UNSIGNED__) || defined(__sgi) #define INT1 signed char /* integer, signed 1 Byte */ #define INT1_MIN SCHAR_MIN #define INT1_MAX SCHAR_MAX #else #define INT1 char /* integer, signed 1 Byte */ #define INT1_MIN CHAR_MIN #define INT1_MAX CHAR_MAX #endif #define UINT1 unsigned char /* integer, unsigned 1 Byte */ #define UINT1_MIN 0 #define UINT1_MAX UCHAR_MAX #define LONG_FORMAT _INT64_FORMAT typedef INT4_8 Hlong; typedef UINT4_8 Hulong; 看粗体部分,可以看到Hlong型在32位的机器上其实就是long型代表4个字节32位,在64位机器上有另一种定义 再来看看halcon中最重要的数据类型HTuple,在C++里面,halcon将HTuple类型封 装了类,其始祖类HRootObject,这个类相当于MFC里面的CObject,halcon从HRootObject 派生了HBaseArray,当然这两个类是虚基类,有一些方法需要我HTuple自己实现,当然也 有一些方法可以直接用的。这两个类在HCPPUtil里,可以看看。 HTuple类就是从HBaseArray派生,元组基类,相当于数组,具有如下的构造函数: HTuple(int l); HTuple(float f); HTuple(double d); HTuple(constchar *s);

精雕实训报告

精工实习报告 学院:西安科技大学高新学院 专业班级:工业设计0901 姓名:周书剑 学号:06 指导老师:何瑶 实习时间:2012年4月9日——2012年4月22日实习地点:西安科技大学高新学院精雕机房。 实习内容:使用精雕软件制作灰度图和使用精雕机 2012年4月9日,我们开始了为期10天的精工实习,这次我们实习的内容是掌握精雕软件制作灰度图和使用精雕机加工精雕。实习开始时,我们认识了教我们使用精雕软件、使用精雕机的吴老师以及管理我们行程的马老师。刚进入精雕机房时,我们对一切还不是很熟悉,在吴老师的讲解下,我们知道了精雕加工是一种金工工艺,学习它不仅可以让我们获得了机械制造的基础知识,了解了机械制造的一般操作,提高了自己的操作技能和动手能力,而且加强了理论联系实际的锻炼,提高了工程实践能力,培养了工程素质。 (学校的精雕机房) 实习前三天,我们在学校计算机室学习如何使用精雕软件,精雕软件是配套于精雕机器的一种独立软件,类似于图片处理软件coreldraw x4,主要应用于精雕产品的排版和前期图片处理,但是对于精雕机的加工而言,主要用于处理灰度图。在吴老师的细心教导下,我们学会了处理制作灰度图,并掌握了这门软件,这对于参加精雕加工实习的每一位同学来说都是很不错的锻炼。 (灰度图)以上两幅就是我们处理加工过的灰度图。 灰度图:又称为灰阶图,是把白色与黑色之间按对数关系分为若干等级,称为灰度。灰度分为256阶,用灰度表示的图像称为灰度图。 在灰度图制作完成后,我们开始使用精雕机制作加工,教我们的老师很有经验,先由简单的机床操作开始:开关机、摇手轮、装拆刀、对刀,到现在的画图、编刀路。我们可以自由操作机床,也可以随便到别的小组向同学请教,老师对我们的学习进程要求很严格,摇手轮

精雕软件简单教程

精雕软件简单教程 发布: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文件导入雕刻机控制系统(维宏控制)按照维宏控制操作说明进行操作即可完成雕刻。

Halcon

Halcon 目录 1、相机接入且拍摄 (2) 1.1 步骤 (2) 1.2 后续处理函数 (5) 2、相机标定 (7) 2.1标定步骤 (7) 3、手眼系统标定 (11) 3.1 标定步骤 (11) 4、图像坐标和机器臂坐标转换 (13) 4.1 转换步骤 (14) 5、模版匹配(基于形状) (19) 5.1 步骤 (19) 6、常见函数 (25) 6.1 图像分割 (25) 6.2 轮廓提取、处理 (31)

1、相机接入且拍摄 1.1 步骤 (1)连接相机 open_framegrabbe(Name, HorizontalResolution, VerticalResolution, ImageWidth, ImageHeight, StartRow, StartColumn, Field, BitsPerChannel, ColorSpace, Generic, ExternalTrigger, CameraType, Device, Port, LineIn, AcqHandle) 在算子窗口内输入函数名,填入参数后点击“确定”按钮即可将函数加入程序中。 注: Name: 图像采集设备的名称 可通过以下步骤确定: 1、在Halcon菜单栏里点击“窗口”,选择“打开算子窗口”。 (若算子窗口已打开则直接进入第二步) 2、在“输入算子或函数”栏内输入“open_framegrabbe” 回车后出现下图

3、在“参数”栏中的Name后点击即可自动检测连接的设 备(笔记本电脑摄像头检测后为’DirectShow’) 此参数若随意填写,可能导致程序报错 HorizontaResolution、VerticalResolution:预期的图像采集接口的水平分辨率和垂直分辨率 ImageWidth、ImageHeight:预期图像的宽度和高度部分StartRow、StartColumn:显示预期图像的开始坐标 Field:预期图像是一半的图像或者是完整图像 BitsPerChannel:每像素比特数和图像通道 ColorSpace:获取图像的输出形式(gray、raw、rgb、yuv、default)说明:此参数设置不同的值可以得到不同的图像效果,如设置

halcon学习笔记——实例篇 长度和角度测量+

halcon学习笔记——实例篇长度和角度测量实例二:长度和角度测量 素材图片: halcon代码: 1: *读取并截取图片 2: dev_close_window() 3: read_image (Image, 'D:/MyFile/halcon/长度和角度测量/图.png') 4: crop_rectangle1 (Image, ImagePart, 75, 0, 400, 400) 5: get_image_size (ImagePart, Width, Height) 6: dev_open_window (0, 0, Width, Height, 'black', WindowHandle) 7: dev_display (ImagePart) 8: 9: *获取图形的边界 10: threshold (ImagePart, Regions, 0, 112) 11: 12: *分离三角形和圆形

13: connection(Regions,ConnectedRegions) 14: sort_region(ConnectedRegions,SortedRegions,'upper_left','true','column') 15: select_obj(SortedRegions,Circle,1) 16: select_obj(SortedRegions,Triangle,2) 17: 18: *获取三角形各边的信息 19: skeleton(Triangle,TriangleSkeleton) 20: gen_contours_skeleton_xld(TriangleSkeleton,TriangleContours,1,'filter') 21: segment_contours_xld(TriangleContours,ContoursSplit,'lines_circles', 5, 4, 2) 22:select_contours_xld(ContoursSplit,SelectedContours, 'contour_length',100, 999, -0.5, 0.5) 23: fit_line_contour_xld (SelectedContours, 'tukey', -1, 10, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist) 24: 25: *计算三角形角度 26:angle_ll (RowBegin[0], ColBegin[0], RowEnd[0], ColEnd[0], RowBegin[1], ColBegin[1], RowEnd[1], ColEnd[1], Angle1) 27:angle_ll (RowBegin[0], ColBegin[0], RowEnd[0], ColEnd[0], RowBegin[2], ColBegin[2], RowEnd[2], ColEnd[2], Angle2) 28:angle_ll (RowBegin[1], ColBegin[1], RowEnd[1], ColEnd[1], RowBegin[2], ColBegin[2], RowEnd[2], ColEnd[2], Angle3) 29: Angle1:=abs(deg(Angle1)) 30: Angle2:=abs(deg(Angle2)) 31: Angle3:=abs(deg(Angle3)) 32: 33: *获取圆的信息 34: area_center(Circle,AreaCircle, RowCircle, ColumnCircle) 35: 36: *计算圆心到三角形各边的距离 37: Distance := [] 38:for Index := 0 to 2 by 1 39:distance_pl (RowCircle, ColumnCircle, RowBegin[Index], ColBegin[Index], RowEnd[Index], ColEnd[Index], ThisDistance) 40: Distance := [Distance,ThisDistance] 41: endfor

精雕软件最齐全快捷键

精雕软件最齐全快捷键 精雕软件最齐全快捷键 新建 Ctrl +N 建立新文挡 打开 Ctrl+O 打开一个现有的文档 保存 Ctrl+S 保存活动文档 窗口观察 F5 对图形进行窗口放大 全部观察 F6 将所有的图形显示到整个工作窗口选择观察 F7 将选择的图形显示到整个工作窗口上次观察 F8 恢复到上次的工作窗口 全屏观察 F12 开启或关闭全屏绘图模式 重画 Ctrl+R 重新显示工作窗口 正交捕捉 Ctrl+D 开启或关闭正交捕捉模式特征点自动捕捉 Ctrl+E 开启或关闭特征点自动捕捉模式显示填充 Ctrl+F 显示或隐藏填充颜色直线 Ctrl+Q 绘制直线 圆弧 Ctrl+A 绘制圆弧 多义线 Ctrl+W 绘制多义线 撤消 Ctrl+Z 撤消一步操作 剪切 Ctrl+X 剪切被选对象,并将其置于剪贴板上复制 Ctrl+C 复制被选对象,并将其置于剪贴板上删除 Del 删除被选对象 切断 Alt+1 图形切断 修剪 Alt+2 图形快速裁剪 延伸 Alt+3 非闭合图形延伸 倒圆角 Alt+4 倒斜角 Alt+5 连接

Alt+6 区域等距 Ctrl+1 计算轮廓曲线区域的等距线区域焊接 Ctrl+2 曲线轮廓区域的求并运算区域剪裁 Ctrl+3 曲线轮廓区域的相减运算 区域相交 Ctrl+4 曲线轮廓区域的求交集运算 ** Alt+F2 将被选图形组合为一个** 取消** Alt+F3 将被选图形打散成为单个图形 1――笔刷恢复为默认值 2――改变颜色模板选项 3――改变拼合方式选项(磨光模式下:保留硬边) 4――改变高度模式选项 5――改变半衰直径比例 6――进入虚拟雕塑 7――进入选择工具 8――进入节点编辑工具 9或0――选择导动笔刷类型 Q,W――刷子高度减/增 A,S――刷子尺寸减/增 Z,X――取消/恢复 D,F――半衰直径减/增 E――图形隐藏/显示 R――模型隐藏/显示 B――流动层整体着色 P――自动分色 N――整体擦除颜色 V――绘制多义线 C――精细/粗糙显示

精雕实训报告

精雕实训报告 TYYGROUP system office room 【TYYUA16H-TYY-TYYYUA8Q8-

精工实习报告 学院:西安科技大学高新学院 专业班级:工业设计0901 姓名:周书剑 学号 指导老师:何瑶 实习时间:2012年4月9日——2012年4月22日实习地点:西安科技大学高新学院精雕机房。 实习内容:使用精雕软件制作灰度图和使用精雕机 2012年4月9日,我们开始了为期10天的精工实习,这次我们实习的内容是掌握精雕软件制作灰度图和使用精雕机加工精雕。实习开始时,我们认识了教我们使用精雕软件、使用精雕机的吴老师以及管理我们行程的马老师。刚进入精雕机房时,我们对一切还不是很熟悉,在吴老师的讲解下,我们知道了精雕加工是一种金工工艺,学习它不仅可以让我们获得了机械制造的基础知识,了解了机械制造的一般操作,提高了自己的操作技能和动手能力,而且加强了理论联系实际的锻炼,提高了工程实践能力,培养了工程素质。 (学校的精雕机房) 实习前三天,我们在学校计算机室学习如何使用精雕软件,精雕软件是配套于精雕机器的一种独立软件,类似于图片处理软件coreldraw x4,主要应用于精雕产品的排版和前期图片处理,但是对于精雕机的加工而言,主要用于处理灰度图。在吴老师的细心教导下,我们学会了处理制作灰度图,并掌握了这门软件,这对于参加精雕加工实习的每一位同学来说都是很不错的锻炼。 (灰度图)以上两幅就是我们处理加工过的灰度图。 灰度图:又称为灰阶图,是把白色与黑色之间按对数关系分为若干等级,称为灰度。灰度分为256阶,用灰度表示的图像称为灰度图。 在灰度图制作完成后,我们开始使用精雕机制作加工,教我们的老师很有经验,先由简单的机床操作开始:开关机、摇手轮、装拆刀、对刀,到现在的画图、编刀路。我们可以自由操作机床,也可以随便到别的小组向同学请教,老师对我们的学习进程要求很严格,摇手轮测试必须一分钟完成。装拆刀也只给我们1分30秒。刚开始我们练习完成时,都用了老师要求的好几倍的时间,经过半天的练习,我们基本都通过老师的测试。那时我们特别兴奋,感觉这不只是我们实习的地方,更是开发我们潜力的地方。精雕机:顾名思义。就是可以精确雕、也可铣,雕刻机的基础上加大了主轴、伺服电机功率,床身承受力,同时保持主轴的高速,更重要的是精度很高。 一个多星期过去了,我接触最多的是数控编程这一块,现在我们每天操机、编程,在加工过程中不断摸索、总结。也因为自己的总结所以才会有更多的收获,刚开始编一个程序需要2个小时,现在只要半个小时就完成了。为期两周的机电设备拆装实习转眼就结束了,但是带给我的感受却永远的留在了我的心。总的来说,这次为期两周的实习活动是一次有趣的,且必给了我今后的学习工作上的重要的经验。在以后的时间里也恐怕不会再有这样的机会去让我们去体验这样 的生活,也恐怕难有这样的幸运去体验身边的每一样东西到底是如何制造出来的了。 随着科学的迅猛发展,新技术的广泛应用,会有很多领域是 我们未曾接触过的,只有敢于去尝试才能有所突破,有所创新。就像我们接触到的加工中心、车床,虽然它的危险性很大,但是要求每个同学都要去操作而且要加工出产品,这样就锻炼了大家敢于尝试的勇气。数控加工实习带给我们的,不全是我们所接触到的那些操作技能,也不仅仅是通过几项工种所要求我们锻炼的几种能力,更多的则需要我们每个人在实习结

Halcon学习2_图形图像数据结构

1·Image 在Halcon中,Image=Channel+Domain,其中,像素点放在channel矩阵中,根据ROI对Image进行描述。 2·Region 为某些符合要求性质的像素子集,或者说一些被选择的图块区域s,region大小不受图像限制,有fill和margin两种表达方式,可用于压缩。 *选择相应区域 select_shape(regions,output,'select type',..requirements) *计算相应区域的面积,中心坐标 area_center(regions,area,row,column) *不规则区域的转换 shape_trans(region,regiontrans,type) 3·图型变量XLD(eXtended Line Descriptions) XLD代表亚像素级别的轮廓或者多边形 *XLD的选择操作 select_shape_xld(XLD : SelectedXLD : Features, Operation, Min, Max : ) select_contours_xld(Contours : SelectedContours : Feature, Min1, Max1, Min2, Max2 : ) *计算xld的面积以及中心位置 //area_center_xld(XLD:::Area,row,column,pointOrder) *Xld 的拟合操作(fit_***_contour_xld) 把不完整的形状拟合完整 fit_line_contour_xld fit_circle_contour_xld fit_ellipse_contour_xld fit_rectangle2_contour_xld 4·读取照片方法 a·申明一个数组,分别保存路径 ImagePath:=[] ImagePath[0]:='D:/1.bmp' ImagePath[1]:='D:/2.bmp' ImagePath[2]:='D:/3.bmp' for i:=0 to 2 by 1 read_image(Image,ImagePath[i]) endfor

halcon与C#混合编程(三)数字识别

示例:数字识别要识别的图片: halcon源码: 1: *读取图片 2: read_image(Image,'D:/My数字识别/1.jpg') 3: 4: *图像处理 5: decompose3(Image, ImageR, ImageG, ImageB) 6: threshold (ImageG, Regions, 0, 183) 7: connection (Regions, Connection) 8: 9:select_shape (Connection, SelectedRegions, 'area', 'and', 1987.72, 7500) 10: 11: read_ocr_class_mlp('Document_0-9.omc',OCRHandle)

12: do_ocr_multi_class_mlp(SelectedRegions,ImageG,OCRHandle, Class, Confidence) halcon导出的C#代码: 1:// 2:// by HDevelop for HALCON/DOTNET (C#) Version 10.0 3:// 4:// This intended to be used with the HDevelopTemplate or 5:// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# 6: 7:using System; 8:using HalconDotNet; 9: 10:public partial class HDevelopExport 11: { 12:public HTuple hv_ExpDefaultWinHandle; 13: 14:// Main procedure 15:private void action() 16: { 17: 18:// Local iconic variables 19: 20: HObject ho_Image, ho_ImageR, ho_ImageG, ho_ImageB; 21: HObject ho_Regions, ho_Connection, ho_SelectedRegions; 22: 23: 24:// Local control variables 25: 26: HTuple hv_OCRHandle, hv_Class, hv_Confidence; 27: 28:// Initialize local and output iconic variables 29: HOperatorSet.GenEmptyObj(out ho_Image); 30: HOperatorSet.GenEmptyObj(out ho_ImageR); 31: HOperatorSet.GenEmptyObj(out ho_ImageG); 32: HOperatorSet.GenEmptyObj(out ho_ImageB); 33: HOperatorSet.GenEmptyObj(out ho_Regions); 34: HOperatorSet.GenEmptyObj(out ho_Connection); 35: HOperatorSet.GenEmptyObj(out ho_SelectedRegions); 36: 37://读取图片 38: ho_Image.Dispose();

精雕软件资源

软件说明: 1. 5.19版,5.21版,5.5优化版,这三个版本我拿到手时都是免安装版。考虑到 可能有些人使用不习惯。所以我已经重新打包过了。并对一些细节做了修改。 不过……可以保证软件运行的稳定,完美性。 2. 其中5.20版,5.21版,5.50优化版需要5.20的加密狗(5.5的加密狗不行) 除5.5优化版外,其它5.5版本均需要5.5圣天狗。其它版本不需要加密狗 3. 其中5.19是免狗破解版,已经支持输出【3.x】【 4.x】【 5.x】三种主轴路径 4. 精雕 5.5优化版。可以用5.2的狗。可以打开大部分5.5版本文件(并不是全部), 以及所有老版本精雕文件,包括5.19版,5.20版,还有5.21版本的文件。 不自量力重新制作的图标

5.5优化版的自动分色(快捷键为 P): JDPaint 5.50 LOGO by Wei

★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ ↓ ↓下载地址↓ ↓===================================================================== ========================= 【精雕常用快捷键】适用5.20或更高版本。该文档适合全部功能都使用快捷键的朋友。不建议初学的朋友下载。 本地下载→在本地下载文字上面右键然后选择(打开)或是 ( 在新选项卡中打开)都可以 ===================================================================== =========================

灰度图转浮雕

灰度图转浮雕简易处理步骤 灰度图转浮雕简易处理过程(入门) 发这个贴,算是给新人和自己上个小课吧。当是无脑输出。 刚好给客户完成一张抽屉面的图,规格为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支持‘特征,削除锯 齿’加以应用下,定更接近美感。

精雕实例操作

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

边拉伸)〈图24〉。 第三步:灰度转浮雕,艺术曲面-图像处理-位图转网格(注意左下角出现: 点选一位图)-点击图像-弹出窗口输入需要的曲面高度(我这里为);右向左框选曲面按6进入‘虚拟雕塑环境’F6‘全局观察’-‘雕塑,冲压’去掉外框线条〈图32〉。 第四步(重要部分,个人技巧):完善灰度图转浮雕,去掉中心线-‘颜色, 等高填色’(注意右上角,如图41设置)-点击浮雕(如图42效果)-再次在龙头外线点击(龙头明显还有水纹,直到把多余水纹填色掉,如图43)-‘颜色,颜色区域矢量化’生成外框线(小技巧:这个还有另外一个快捷键是/)-‘效果,磨光’多磨几次直到表面光滑,当然图像不能模糊了;接下来这个步骤很重要雕出来好不好看就看这了,‘冲压’右边选颜色内,SHIFT+左键拾取填充的颜色-左键冲压闭合区域(图中有三个位置注意了)-如是正版支持‘特征,

精雕灰度图转浮雕的做法

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

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

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

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

halcon知识点

1.无论读入什么图像,读入图像显示效果明显和原始图像不一致,哪怕是从相机读入的图像,也是明显颜色差异。什么原因引起? 初步诊断是,显示的时候调用的颜色查找表存在异常不是default,而是其它选项。此时可以通过查阅相关参数,调用set_system解决,也可以在编辑-》参数选择-》颜色查找表进行更改。 2.裁剪图像;从图像上截取某段图像进行保存。如何实现该操作? 首先应该知道,region不具有单独构成图像的要素,他没有灰度值。有用过opencv的应该知道ROI(感兴趣区域),设置好它后,对图像的大部分操作就转为图像的一个矩形区域内进行。类似的,halcon有domain概念。首先设置好一个矩形区,然后使用reduce_domain(是一个矩形区域)后,再使用 crop_domain就裁剪出图像。 3.读入bmp,或tiff图像显示该图不是bmp文件或不能读。原因是什么? 这个常有新手询问,画图,图像管理器都能打开,又或者是相机采集完直接存到硬盘。Halcon读取图像在windows下面到最后是调用windows库函数实现读图功能。咱不清楚到底是怎么调用的。对于图像格式,在读图函数F1说明很细。基本bmp如果文件头不是bw还是bm(百度百科bmp格式查找,编写此处时无网络,后续可能忘记),就读不进来。其他规格欢迎补充。解决办法,如果是相机采集,就在内存直接转换(参见halcon到里面的halcon和bitmap互转);如果是采完的图片,大部分通过画图工具转换为24位bmp格式,即可解决。 4.读入avi文件报错。Halcon通过directshow或另一个格式解析视频,正常来说应该可以读入市面大部分视频,实际测试发现只能读入最标准的avi文件格式。如果需要临时处理,需要下格式工厂等工具转化为最标准的avi文件格式(论坛叶诺有发帖说明)。 5. Region或xld筛选。 Halcon提供了丰富的region和xld筛选方法。Region可以使用 select_shape_xld,选择出符合要求的区域,如果不能满足还可以通过类似

相关文档
最新文档