第一题(如下图):
• 物距1.5米;
• 对酒瓶酒液整个高度成像;
• 要求2mm×2mm的杂质成像分辨率大于5×5个像素; • 像元尺寸10*10(10e-6m)
• 选择合适的镜头与分辨率的摄像机。
答:像元尺寸为10m10m,则杂质所成的像的尺寸最少为
(10m5)(10m5)50m50m,可由此计算镜头的焦距为
50m1.5m37.5mm。 2mm对于相机分辨率,则要根据成像视野对应的实际范围而定。例如若视野范围为
20cm20cm,则相机分辨率应不小于
20cm5500500像素。 2mm2第二题:图1给出四幅原始8位灰度图像,分别为人民币,生料球,钢锭和红血球。图2给出上述四幅原始图像的灰度直方图。图3给出人民币图像在灰度级阈值分别为64,128,160条件下的分割结果。其中图2给出的4个灰度直方图,图3给出的3个灰度级阈值分割结果与原始图像以及上述给出的阈值顺序可能不
一致。图中坐标每个刻度为16个单位。
(1)图2表示对应于图1的4个灰度直方图,请在图2中的各序号(a),(b),(c),(d)后面标记所对应于图1的原始图像名称;
(2)如果将灰度小于阈值的像素置255,大于阈值的像素置0,对于图2(c)所示的灰度直方图,如果阈值选择为144,其原始图像的灰度分割将会出现什么结果?
答:将会让图中的圆点与背景分割开,有更加强烈的对比度,利于接下来的处理。
(3)图3表示人民币图像在不同阈值下的分割结果,请在图3的(a),(b),(c)序号后面
标记所对应的阈值,并说明为什么会出现上述三种结果。
(4)根据图2(d)所给出的灰度直方图,你认为是否能够确定灰度级阈值,为什
么。
答:不能,因为直方图中表现出来的阈值都非常接近,对于我们想要分割的部分来说,灰度部分都不一统一,没有一个可以确定的阈值能够将生料球都分割出来。
答:因为阈值小的图中白色的肯定会占有比较大的比例,所以越白,越是阈
值小的图;越黑,越是阈值大的图。
(a)生料球 (b)红血球 (c)人民币 (d)钢锭
图1 原始图像
(a) 钢锭 (b) 人民币
(c) 红血球 (d) 生料球
图2 灰度直方图
(a)64 (b)128 (c)160
图3人民币图像灰度分割结果
第三题:
答:首先对图像进行分析。
只要图像中的圆形是不间断的完整的,就说明是合格的,如果圆形有间断,则说明是不合格的。 (1) 对图像进行滤波。
(2) 对图像进行阈值分割,进行二值化处理。
(3) 对图像所有点做出一个索引表,将表内数据全部赋值为1。
(4) 取图像左上角一点,然后对该点四周的点进行判断,是否为黑色点,如有,
则记录下该点位置,并在索引表中将该点的索引值改为0。 (5) 分析与上一点相邻近的为黑色的点的四周,用相同方法处理。
(6) 当所有点处理完毕之后,分析索引表中为1点的数量,如果大于某个比例,
则说明该圆形封闭良好,说明圆形没有间断,所以是合格的。
如果小于某个比例,则说明圆形封闭不好,圆形出现间断,不合格。
第四题:
答:(1)首先对图像进行滤波操作。 (2)首先取射击前情况图像一张。 (3)取设计后情况图像一张。
(4)将两张图像进行比较,取出发生变化的点,既是当前射击中击中的点。 (5)根据阈值分析法,及滤波操作,得出靶上的中心圆位置。
(6)根据直径最长原理,两直径相交点为圆心的原理,计算出圆心位置。 (7)现在设圆心点为O,击中点为P,按照射线OP方向,计算出O点距离中心圆环外围的距离L1。
(8)计算出OP两点的距离L2。 (9)当前的靶数即为:10-L2/L1
第五题:
设计自动检测车速的机器视觉系统,并列出其每步用到的图像处理方法。 答:(1)在需要测速的路口上安装摄像头。 (2)采集一系列某一光照情况下的无车图像。 (3)根据一定时间间隔不断采集图像。
(4)将当前采集图像与当前光照情况下采集的无车图像进行比较操作,将不同像素点提取出来,构成一张只包含矩形框(车型)的图像。
(5)采集下一张图像,并仍然构成一张只包含矩形框(车型)的图像。 (6)比较两张图像中矩形框的移动距离,除以两张图像的采样间隔,即可知当前车速情况。
第六题:
燕大图标放大2倍,旋转45度。
原图如图示: 程序如下:
//////////////////////////////////////////////////////////////// // HWND hWnd:窗口句柄 // 图像的缩放
BOOL Zoom(HWND hWnd) { //窗口处理函数 DLGPROC dlgInputBox = NULL; //偏移、源和目标内存大小、每行字节数 DWORD OffBits,SrcBufSize,DstBufSize,DstLineBytes; //图像信息头指针和数据区指针 LPBITMAPINFOHEADER lpImgData; LPSTR lpPtr; HLOCAL hTempImgData; LPBITMAPINFOHEADER lpTempImgData; LPSTR lpTempPtr; //图像新旧宽度和高度 DWORD Wold,Hold,Wnew,Hnew; HDC hDc; //文件句柄 HFILE hf; //用来定位象素数据位置 DWORD x0,y0,x1,y1; float num1;
//定义两个文件头结构 BITMAPFILEHEADER DstBf; BITMAPINFOHEADER DstBi; //实例化对话框 dlgInputBox = (DLGPROC) MakeProcInstance ( (FARPROC)InputBox, ghInst ); DialogBox (ghInst, \"INPUTBOX\ FreeProcInstance ( (FARPROC) dlgInputBox ); //得到缩放系数 num1=(float)(1.0/ZoomRatio); //得到原来的宽度高度 Wold=bi.biWidth; Hold=bi.biHeight; //计算新图像的宽度高度 Wnew = (DWORD)(Wold*ZoomRatio+0.5); Hnew = (DWORD)(Hold*ZoomRatio+0.5); //计算数据区到文件信息头的偏移 OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER); //计算源图像所需的内存大小 SrcBufSize=bf.bfSize-sizeof(BITMAPFILEHEADER); ImgWidth=Wnew; ImgHeight=Hnew; //得到目标图像中每行象素的字节数 DstLineBytes=(DWORD)WIDTHBYTES(Wnew*bi.biBitCount); //目标图像所需内容大小 DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+(DWORD)DstLineBytes*Hnew); if((hTempImgData=LocalAlloc(LHND,DstBufSize))==NULL) { MessageBox(hWnd,\"Error alloc memory!\Message\ return FALSE; } lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); //得到数据区指针 lpPtr=(char *)lpImgData; lpTempPtr=(char *)lpTempImgData; //初始化内存 memset(lpTempPtr,(BYTE)255,DstBufSize); //保存源数据 memcpy(lpTempPtr,lpPtr,OffBits);
//创建新的文件头和文件信息头 memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER)); memcpy((char *)&DstBi,(char *)&bi,sizeof(BITMAPINFOHEADER)); DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER); DstBi.biWidth=Wnew; DstBi.biHeight=Hnew; //用新的文件信息覆盖原来的值 memcpy(lpTempPtr,(char *)&DstBi,sizeof(BITMAPINFOHEADER)); //计算新文件数据区的数据 for(y1=0;y1 } ReleaseDC(hWnd,hDc); LocalUnlock(hTempImgData); LocalFree(hTempImgData); GlobalUnlock(hImgData); return TRUE; 缩放后的图像: 旋转后的图像: //////////////////////////////////////////////////////////////// //参数说明: // HWND hWnd:窗口句柄 // 图像的旋转 BOOL Rotation(HWND hWnd) { //定义对话框处理程序 DLGPROC dlgInputBox = NULL; //设定偏移、内存、每行字节数 DWORD OffBits,SrcBufSize,DstBufSize,DstLineBytes; //文件信息头指针 LPBITMAPINFOHEADER lpImgData; //数据区指针 LPSTR lpPtr; HLOCAL hTempImgData; //中间转换用的文件信息头指针 LPBITMAPINFOHEADER lpTempImgData; //转换用的数据去指针 LPSTR lpTempPtr; //定义了旋转系数 float SrcX1,SrcY1,SrcX2,SrcY2,SrcX3,SrcY3,SrcX4,SrcY4; float DstX1,DstY1,DstX2,DstY2,DstX3,DstY3,DstX4,DstY4; //新旧文件的宽高 DWORD Wold,Hold,Wnew,Hnew; //定义一个HDC HDC hDc; HFILE hf; //用来计算象素的位置 DWORD x0,y0,x1,y1; //两个三角变量 float cosa,sina; float num1,num2; //两个文件头结构 BITMAPFILEHEADER DstBf; BITMAPINFOHEADER DstBi; //实例化对话框 dlgInputBox = (DLGPROC) MakeProcInstance ( (FARPROC)InputBox, ghInst ); DialogBox (ghInst, \"INPUTBOX\FreeProcInstance ( (FARPROC) dlgInputBox ); //产生旋转角度 RotateAngle=(float)RADIAN(RotateAngle); //得到旋转的三角数值 cosa=(float)cos((double)RotateAngle); sina=(float)sin((double)RotateAngle); //源图像宽高 Wold=bi.biWidth; Hold=bi.biHeight; //计算源图像旋转后要显示的区域 SrcX1=(float)(-0.5*Wold); SrcY1=(float)(0.5*Hold); SrcX2=(float)(0.5*Wold); SrcY2=(float)(0.5*Hold); SrcX3=(float)(-0.5*Wold); SrcY3=(float)(-0.5*Hold); SrcX4=(float)(0.5*Wold); SrcY4=(float)(-0.5*Hold); //新图像对应数值 DstX1=cosa*SrcX1+sina*SrcY1; DstY1=-sina*SrcX1+cosa*SrcY1; DstX2=cosa*SrcX2+sina*SrcY2; DstY2=-sina*SrcX2+cosa*SrcY2; DstX3=cosa*SrcX3+sina*SrcY3; DstY3=-sina*SrcX3+cosa*SrcY3; DstX4=cosa*SrcX4+sina*SrcY4; DstY4=-sina*SrcX4+cosa*SrcY4; //新图像的宽高 Wnew = (DWORD)(max(fabs(DstX4-DstX1), fabs(DstX3-DstX2))+0.5); Hnew = (DWORD)(max(fabs(DstY4-DstY1), fabs(DstY3-DstY2))+0.5); num1=(float)( -0.5*Wnew*cosa-0.5*Hnew*sina+0.5*Wold); num2=(float)(0.5*Wnew*sina-0.5*Hnew*cosa+0.5*Hold); //得到数据到文件头的偏移 OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER); //源图像所需内存 SrcBufSize=bf.bfSize-sizeof(BITMAPFILEHEADER); ImgWidth=Wnew; ImgHeight=Hnew; //目标图像每行字节数 DstLineBytes=(DWORD)WIDTHBYTES(Wnew*bi.biBitCount); //目标图像所需内存 DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+(DWORD)DstLineBytes*Hnew); //查看内存分配 if((hTempImgData=LocalAlloc(LHND,DstBufSize))==NULL) { MessageBox(hWnd,\"Error alloc memory!\Message\ return FALSE; } //锁定内存区域指针指向数据区 lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); //转换成字节型指针 lpPtr=(char *)lpImgData; lpTempPtr=(char *)lpTempImgData; //初始化内存 memset(lpTempPtr,(BYTE)255,DstBufSize); memcpy(lpTempPtr,lpPtr,OffBits); //得到新的文件头和文件信息头 memcpy((char *)&DstBf,(char *)&bf,sizeof(BITMAPFILEHEADER)); memcpy((char *)&DstBi,(char *)&bi,sizeof(BITMAPINFOHEADER)); DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER); DstBi.biWidth=Wnew; DstBi.biHeight=Hnew; //用新文件信息覆盖文件信息头内容 memcpy(lpTempPtr,(char *)&DstBi,sizeof(BITMAPINFOHEADER)); //旋转操作 for(y1=0;y1 因篇幅问题不能全部显示,请点此查看更多更全内容