您的当前位置:首页正文

图像处理作业6道题

2023-02-14 来源:伴沃教育


第一题(如下图):

• 物距1.5米;

• 对酒瓶酒液整个高度成像;

• 要求2mm×2mm的杂质成像分辨率大于5×5个像素; • 像元尺寸10*10(10e-6m)

• 选择合适的镜头与分辨率的摄像机。

答:像元尺寸为10m10m,则杂质所成的像的尺寸最少为

(10m5)(10m5)50m50m,可由此计算镜头的焦距为

50m1.5m37.5mm。 2mm对于相机分辨率,则要根据成像视野对应的实际范围而定。例如若视野范围为

20cm20cm,则相机分辨率应不小于

20cm5500500像素。 2mm2第二题:图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=0) && (x0=0) && (y0*)lpTempImgData+(DstBufSize-DstLineBytes-y1*DstLineBytes)+x1; //赋值 *lpTempPtr=*lpPtr; } } hDc=GetDC(hWnd); if(hBitmap!=NULL) DeleteObject(hBitmap); //创建位图 hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT, (LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD), (LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS); //新建图像 hf=_lcreat(\"c:\\\\zoom.bmp\ //保存新图像内容 _lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER)); _lwrite(hf,(LPSTR)lpTempImgData,DstBufSize); _lclose(hf); //释放资源

}

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=0) && (x0=0) && (y0*)lpTempImgData+(DstBufSize-DstLineBytes-y1*DstLineBytes)+x1; //赋值 *lpTempPtr=*lpPtr; } } //得到窗口的DC hDc=GetDC(hWnd); if(hBitmap!=NULL) DeleteObject(hBitmap); //创建位图 hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT, (LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD), (LPBITMAPINFO)lpTempImgData, DIB_RGB_COLORS); //保存位图文件 hf=_lcreat(\"c:\\\\rotation.bmp\ _lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER)); _lwrite(hf,(LPSTR)lpTempImgData,DstBufSize); _lclose(hf); //释放资源 ReleaseDC(hWnd,hDc); LocalUnlock(hTempImgData); LocalFree(hTempImgData); GlobalUnlock(hImgData); return TRUE; }

因篇幅问题不能全部显示,请点此查看更多更全内容