2022年数字图像处理试题库.doc
试题库一、填空题:1彩色图像的灰度化处理,将真彩色图像转化成256色灰度图像。要求:转换关系为:Gray(i,j)=0.11R(i,j)+0.59G(i,j)+0.3B(i,j)(1) 获取原图像像素的首地址,及图像的高度和宽度; (2) 得到像素的蓝、绿、红的三个分值;(3) 按照公式要求,计算Gray(i,j);(4) 将该值返回给蓝、绿、红三个分量。void MakeColorDib:MakegGray() BYTE *p_data; int wide,height,DibWidth; p_data=this->GetData (); wide=this->GetWidth (); height=this->GetHeight (); DibWidth=this->GetDibWidthBytes(); for(int j=0;j< height;j+ )for(int i=0;i< DibWidth;i+=3)BYTE* pbyBlue = p_data+; /得到蓝色值BYTE* pbyGreen = p_data+; /得到绿色值BYTE* pbyRed = p_data+; /得到红色值BYTE r = *pbyRed; BYTE g = *pbyGreen; BYTE b = *pbyBlue; gray =0.11*r+0.59*g+0.3*b *pbyBlue = gray; /将取到的最大值赋给像素的蓝分量*pbyGreen = gray; /将取到的最大值赋给像素的绿分量*pbyRed = gray; /将取到的最大值赋给像素的红分量for(int j= height/3;j<2*height/3;j+) / 每行for(int i=0;i<DibWidth;i+) / 每列int a=*p_data; /取得当前点的值*p_data=255-a; /取反p_data+; /指向下一指针 for(int j=2*height/3;j<height;j+) / 每行for(int i=0;i<DibWidth;i+) / 每列BYTE* pbydata = p_data+; /取得当前点的值BYTE a=*pbydata; /传给临时变量*pbydata=(a>128)?a:(255-a); /调整2目标物体的轮廓提取。要求:(1)获取原图像像素的首地址,及图像的高和宽;(2)开辟一块内存缓冲区,存储处理后的图像像素;(3)计算图像的平均灰度值,以平均灰度值作为阈值T;(4)对图像进行二值化预处理,像素灰度值大于T的置白,否则置黑;(5)将像素点的8邻域像素读入数组中,如果8个邻域像素都和中心点相同,在内存缓区将该像素点置白,否则保持不变;(6)重复执行(3),对每一个像素进行处理;(7)将处理后的图像数据复制到原图像中。void BingXingBianJieDib:Lunkuotiqu()LPBYTE p_data, lpSrc; int wide,height; int i,j; int n1,n2,n3,n4,n5,n6,n7,n8; lpSrc=this->GetData();p_data=lpSrc;wide=this->GetWidth ();height=this->GetHeight ();/计算图像的平均灰度值T,再进行二值化预处理,像素灰度值大于T的置白,否则置黑。for(j=0;j<height;j+) /对图像进行二值化预处理for( i=0;i<wide;i+) if(*p_data>128) *p_data=255;else *p_data=0; p_data+; p_data=lpSrc; LPBYTE temp=new BYTEwide*height; memset( temp,255,sizeof( temp); for(j=1;j<height-1;j+)for(i=1;i<wide-1;i+) if(p_dataj*wide+i=0) tempj*wide+i=0; n1= p_data(j+1)*wide+i-1; n2= p_data(j+1)*wide+i; n3= p_data(j+1)*wide+i+1; n4= p_dataj*wide+i-1; n5= p_dataj*wide+i+1; n6= p_data(j-1)*wide+i-1; n7= p_data(j-1)*wide+i; n8= p_data(j-1)*wide+i+1; /如果相邻的八个点都是黑点 if(n1+n2+n3+n4+n5+n6+n7+n8=0) tempj*wide+i=255; memcpy(lpSrc, temp,wide*height); delete temp; 3编程实现分别统计24位真彩色图像R、G、B直方图。要求:本程序功能是对24位真彩色图像的R、G、B分别进行直方图统计,R、G、B分布密度分别放在数组tongji_RED , tongji_GREEN , tongji_ BLUE 里。请将程序代码补充完整。void HuiDuBianHuanDib:ZhiFangTu(float *tongji_RED, float *tongji_GREEN, float *tongji_BLUE)int i,j;int wide,height; LPBYTE p_data; p_data=this->GetData();height=this->GetHeight ();wide=this->GetWidth ();4根据结构编程实现图像的闭运算。要求:(1)得原图像的首地址及图像的宽和高。(图像已经二值化,背景为白,物体为黑)。(2)辟一块内存缓冲区,并初始化为255。(3)定义一个结构数组B9。B 9 = (4)为防越界,不处理最左边、最右边、最上边和最下边四边的像素,从第2行第2列开始进行闭运算。(5)循环步骤4,直到处理完原图的全部像素点。(6)将结果从内存复制到原图的数据区。void FuShiYuPengZhangDib:Onfushi() int i,j,m,n;LPBYTE p_data;LPBYTElpSrc;LPBYTElpDst;LPBYTEtemp;p_data = GetData();LONG wide= GetWidth();LONG height =GetHeight();temp =new BYTEwide*height;lpDst = (LPBYTE)temp;memset(lpDst, (BYTE)255, wide * height);/ 3×3的结构元素int B9 = 1, 0, 1,0, 0, 0,1, 0, 1;/ 使用全方向的结构元素进行腐蚀for (j = 1; j < height - 1; j+)for (i = 1; i < wide - 1; i+)/ 由于使用3×3的结构元素,为防止越界,所以不处理最左、右、上、下四/边的像素/ 指向源图像倒数第j行,第i个象素的指针lpSrc = (unsigned char *)(p_data + wide * j + i);/ 指向目标图像倒数第j行,第i个象素的指针lpDst = (unsigned char *)(temp + wide * j + i);/ 目标图像中的当前点先赋成黑色*lpDst = 0;/ 如果源图像中3×3结构元素对应位置有白点/ 则将目标图像中的(0,0)点赋成白色for (m = 0; m < 3; m+)for (n = 0; n < 3; n+)if (Bm + n = 1)continue;if (*(lpSrc + (1 - m) * wide +(n - 1) ) > 128)*lpDst = 255;break;memcpy(p_data, temp, wide * height);delete temp;5编程实现图像的渐隐。要求:显示一幅位图,像素浓度由亮到暗,逐渐减弱,直至全黑。请写出渐隐的程序代码。void CDynSplitView2:OnJianyin() CDC *pDC=GetDC();CRect rect(0,0,1000,1000);CBrush brush(RGB(255,255,255);pDC->FillRect(&rect,&brush);clearmem();CDSplitDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if(!pDoc ->statedoc&&state2=1 ) BYTE* pBitmapData = CDibNew1->GetData(); LPBITMAPINFO pBitmapInfo = CDibNew1->GetInfo(); int bitmapHeight= CDibNew1->GetHeight(); int bitmapWidth = CDibNew1->GetWidth();if (CDibNew1->GetRGB() / Has a color tableCPalette* hPalette=CreateBitmapPalette(CDibNew1);CPalette * hOldPalette =pDC->SelectPalette(hPalette, true);pDC->RealizePalette();LPBYTE temp,temp1,temp2;temp=new BYTECDibNew1->GetHeight()*CDibNew1->GetHeight();memset (temp,0,CDibNew1->GetHeight()*CDibNew1->GetHeight();for(int n=0;n<=256 ; n+ )temp1=temp temp2=pBitmapData for(int j=0;j<bitmapHeight ; j+) for(int i=0;i< bitmapWidth; i+ ) *temp1=(*temp2)*n/256;temp1+; temp2+; /显示图像:StretchDIBits(pDC->GetSafeHdc(),0, 0, bitmapWidth, bitmapHeight,0, 0, bitmapWidth, bitmapHeight,temp,pBitmapInfo,DIB_RGB_COLORS, SRCCOPY);Sleep(0.0005);pDC->SelectPalette(hOldPalette, true);:DeleteObject(hPalette);delete temp; 6对灰度图像进行N×N十字型中值滤波处理。要求:(1)取得图像大小、数据区,并把数据区复制到缓冲区中;(2)取得N值;(3)循环取得各点像素值;(4)对以该点为中心的N*N十字型屏蔽窗口包括的各像素值进行排序,得到中间值;(5)把该点像素值置为中间值;(6)把缓冲区中改动的数据复制到原数据区中。void ZaoShengXiaoChuDib:nnzhong(int n)DWORD size;size=GetSize();BYTE* p_temp=new BYTE size;memset(p_temp,255,size);int yy,xx,n2,nn,chuo,chg,m,medi,madom,mado1000;BYTE *p_data; int wide,height; if(n<3|n%2!=1)AfxMessageBox("请输入一个大于等于3的奇数");if(n>=3&&n%2=1)n2=(n-1)/2;nn=n*n;chuo=(nn-1)/2;p_data=this->GetData();wide=this->GetWidth(); height=this->GetHeight(); for(int j=n2;j<height-n2;j+)for(int i=n2;i<wide-n2;i+)m=0;for(yy=j-n2;yy<=j+n2;yy+)madom=p_datayy*wide+i;m+;for(xx=i-n2;xx<=i+n2;xx+)if(xx=i)continue;madom=p_dataj*wide+xx;m+;/把madom中的值按下降顺序用冒泡法排序do chg= 0 for(m=0;m< nn-1 ; m+ )if(madom<madom+1) madom=madom; madom=madom+1; madom+1=madom; chg=1; while(chg=1); medi=madochuo; p_tempj*wide+i=medi; memcpy(p_data,p_temp,size);delete p_temp;7编程实现灰度图像的伪彩色处理。要求:修改颜色索引表,将灰度图像显示成彩色图像。将灰度区间表示成如下5种典型的颜色:0 ,50 表示成:黑色; 51,100 表示成:蓝色;101,150 表示成:红色; 151,200 表示成:黄色;201,255 表示成:绿色。CPalette * CDynSplitView2:CreateBitmapPalette(CDib * pBitmap)structWORD Version;WORD NumberOfEntries;PALETTEENTRY aEntries256; palette = 0x300, 256 ;LPRGBQUAD pRGBTable = pBitmap->GetRGB();UINT numberOfColors = pBitmap->GetNumberOfColors();for(UINT x=0; x<numberOfColors; +x)/请修改颜色表if(x>0)&&(x<50) if(x>51) &&(x<100) if(x>101)&&(x<150) if(x>151)&&(x<200) if(x>201)&&(x<255) palette.aEntriesx.peRed =pRGBTablex.rgbRed;palette.aEntriesx.peGreen =pRGBTablex.rgbGreen;palette.aEntriesx.peBlue =pRGBTablex.rgbBlue;palette.aEntriesx.peFlags = 0;/ hPalette已在视类定义hPalette.CreatePalette(LPLOGPALETTE)&palette);return &hPalette;8.中值滤波是指将当前像元的窗口(或领域)中所有像元灰度由小到大进行排序,中间值作为当前像元的输出值,试编程实现3×3中值滤波。原始图像的部分数据为:LPBYTE p_data;p_data = GetData();LONG wide= GetWidth();LONG height =GetHeight();答:int m;for(int j=1;j<height;j+) for(int i=1;i<wide;i+) for(int yy=j-1;yy<=j+1;yy+) for(int xx=i-1;xx<=i+1;xx+) int madom=p_datayy*wide+xx;m+; do int chg=0; for(m=0;m<8;m+) if(madom<madom+1) int madom=madom; madom=madom+1; madom+1=madom; chg=1; while(chg=1) int medi=mado4; p_dataj*wide+i=medi; 9. 完成对一幅 宽为wide, 高为 height 的灰度图像进行垂直镜像变换的程序。原始图像的部分数据为:LPBYTElpSrc; / 指向源图像的指针LPBYTE p_data; / 指向要复制区域的指针LPBYTElpDst;/ 指向复制图像的指针long height=this->GetHeight();/图像的高与宽long wide=this->GetWidth();p_data=this->GetData();答:LPBYTEtemp; LONGi; / 循环变量LONGj; temp = new BYTEwide*height; / 暂时分配内存,以保存一行图像/ 针对上半图像进行操作for(i = 0; i < wide;i+) for(j = 0; j < height; j+) lpSrc = (LPBYTE)p_data + wide * j+i; lpDst = (LPBYTE)temp + wide * (height - j - 1)+i; *lpDst = *lpSrc; memcpy(p_data,temp, wide*height); / 释放内存delete temp;10将图像中的红色球体进行左右、上下、对称复制。 原图 处理后的图像void TuXianFuZhiDib:Onfuzhi() LPBYTE p_data;p_data = GetData();LONG wide= GetWidth();LONG height =GetHeight();11编程实现24位彩色图像进行处理。要求:将24位彩色图像平均分成三个等高的区域,对这三个区域分别进行灰度化处理、逆反处理、曝光处理。(1)对第一个区域进行灰度变换。Gray(i,j)=0.11R(i,j)+0.59G(i,j)+0.3B(i,j)(2)对第二个区域进行逆反处理。(3)对第三个区域进行曝光处理。void MakeColorDib:MakegChange() BYTE *p_data; int wide,height,DibWidth; p_data=this->GetData (); wide=this->GetWidth (); height=this->GetHeight (); DibWidth=this->GetDibWidthBytes(); for(int j=0;j< height/3; j+) for(int i=0;i< ; )BYTE* pbyBlue = p_data+; /得到蓝色值BYTE* pbyGreen = p_data+; /得到绿色值BYTE* pbyRed = p_data+; /得到红色值BYTE r = *pbyRed; BYTE g = *pbyGreen; BYTE b = *pbyBlue; gray =0.11*r+0.59*g+0.3*b *pbyBlue = gray; /将取到的最大值赋给像素的蓝分量*pbyGreen = gray; /将取到的最大值赋给像素的绿分量*pbyRed = gray; /将取到的最大值赋给像素的红分量for(int j= height/3;j<2*height/3;j+) / 每行for(int i=0;i<DibWidth;i+) / 每列int a=*p_data; /取得当前点的值*p_data=255-a; /取反p_data+; /指向下一指针 for(int j=2*height/3;j<height;j+) / 每行for(int i=0;i<DibWidth;i+) / 每列BYTE* pbydata = p_data+; /取得当前点的值BYTE a=*pbydata; /传给临时变量*pbydata=(a>128)?a:(255-a); /调整12彩色图像RGB颜色模型转换为YUV颜色模型。YUV颜色模式,这是电视系统中常用的颜色模式,即电视中所谓的分量(Component)信号。该模式1个亮度信号Y和两个色差信号U、V组成。它是利用了人眼对亮度信号敏感而对色度信号相对不敏感的特点,将RGB颜色通过亮度信号公式Y=029R+050G+011B转换为一个亮度信号Y和两个色差分量信号U、V,即对色差信号进行了频带压缩。RGB变换为YUV坐标转换公式如下:Y 0.299 0.587 0.114 RU = -0.1678 -0.3313 0.5 G V 0.5 -0.4187 -0.0813 B将转换后的YUV信号存储到指针p_yuvdata所指向的数据区间。void MakeColorDib:RGBMakegChangeYUV(BYTE *p_yuvdata) BYTE *p_rgbdata; int wide,height,DibWidth; p_rgbdata=this->GetData (); wide=this->GetWidth (); height=this->GetHeight (); DibWidth=this->GetDibWidthBytes(); for(int j=0;j< j<height; j+) for(int i=0;i< i<DibWidth ; i+=3) int r,g,b; r=*p_rgbdata+; g=*p_rgbdata+; b=*p_rgbdata+; *p_yuvdata= 0.299*r+0.587*g+0.114*b;p_yuvdata+; *p_yuvdata= -0.1678*r-0.3313*g+0.5*b;p_yuvdata+; *p_yuvdata= 0.5*r-0.4187*g -0.0813*b;p_yuvdata+; 13编程实现统计图像灰度直方图要求:本程序功能是对图像进行灰度直方图统计,比如图像总像素数为n,具有r灰度级的像素数为nr,则图像概率密度函数Pr(r)=nr/n 。灰度分布密度放在数组tongji 里。请将程序代码补充完整。void HuiDuBianHuanDib:ZhiFangTu(float *tongji)int i;int j;int huidu256; int wide,height; height=this->GetHeight ();wide=this->GetWidth ();LPBYTE temp1=new BYTEwide*height; memcpy(temp1,m_pData,wide*height );for(i=0;i< height ; i+ )for(j=0;j< wide ; j+ )ussigned char temp=p_temp1wide*i+j huidutemp+; for(i=0;i< 256 ; i+ )tongjii=huidui/(height*wide*1.0f) 14将灰度图像进行转换(如下图所示) 原图 处理后的图像void TuXianZhuanHuanDib:OnZhuanHuan() LPBYTE p_data;p_data = GetData();LONG wide= GetWidth();LONG height =GetHeight(); 15编程实现伪彩色图像的灰度处理。要求:修改颜色索引表,将伪彩色图像显示成灰度图像。将颜色表区间按如下公式进行灰度变换:Gray(i,j)=0.11R(i,j)+0.59G(i,j)+0.3B(i,j)CPalette * CDynSplitView2:CreateBitmapPalette(CDib * pBitmap)structWORD Version;WORD NumberOfEntries;PALETTEENTRY aEntries256; palette = 0x300, 256 ;LPRGBQUAD pRGBTable = pBitmap->GetRGB();UINT numberOfColors = pBitmap->GetNumberOfColors();for(UINT x=0; x<numberOfColors; +x)/请修改颜色表 / hPalette已在视类定义 hPalette.CreatePalette(LPLOGPALETTE)&palette); return &hPalette;16应用迭代阈值法计算阈值,二值化图像后提取目标物体的轮廓。要求:(1)获取原图像像素的首地址,及图像的高和宽;(2)开辟一块内存缓冲区,存储处理后的图像像素;(3)利用迭代阈值法,计算图像的阈值T(选择图像的平均灰度值做为初始阈值);(4)对图像进行二值化预处理,像素灰度值大于T的置白,否则置黑;(5)将像素点的4邻域像素读入数组中,如果4个邻域像素都和中心点相同,在内存缓区将该像素点置白,否则保持不变;(6)重复执行(3),对每一个像素进行处理;(7)将处理后的图像数据复制到原图像中。void BingXingBianJieDib:Lunkuotiqu() LPBYTE p_data, lpSrc; int wide,height; int i,j; int n1,n2,n3,n4; lpSrc=this->GetData(); p_data=lpSrc; wide=this->GetWidth ();height=this->GetHeight ();/迭代法计算图像的阈值T,再进行二值化预处理,像素灰度值大于T的置白,否则置黑。 p_data=lpSrc; LPBYTE temp=new BYTEwide*height; memset( temp,255,sizeof( temp); for(j=1;j<height-1;j+) for(i=1;i<wide-1;i+)