数字图像处理试题库.docx
《数字图像处理试题库.docx》由会员分享,可在线阅读,更多相关《数字图像处理试题库.docx(48页珍藏版)》请在冰点文库上搜索。
数字图像处理试题库
试题库
一、填空题:
1.彩色图像灰度化解决,将真彩色图像转化成256色灰度图像。
规定:
转换关系为:
Gray(i,j)=0.11R(i,j)+0.59G(i,j)+0.3B(i,j)
(1)获取原图像像素首地址,及图像高度和宽度;
(2)得到像素蓝、绿、红三个分值;
(3)按照公式规定,计算Gray(i,j);
(4)将该值返回给蓝、绿、红三个分量。
voidMakeColorDib:
:
MakegGray()
{
BYTE*p_data;
intwide,height,DibWidth;
p_data=this->GetData();
wide=this->GetWidth();
height=this->GetHeight();
DibWidth=this->GetDibWidthBytes();
for(intj=0;jfor(inti=0;i{
BYTE*pbyBlue=p_data++;//得到蓝色值
BYTE*pbyGreen=p_data++;//得到绿色值
BYTE*pbyRed=p_data++;//得到红色值
BYTEr=*pbyRed;
BYTEg=*pbyGreen;
BYTEb=*pbyBlue;
gray=0.11*r+0.59*g+0.3*b
*pbyBlue=gray;//将取到最大值赋给像素蓝分量
*pbyGreen=gray;//将取到最大值赋给像素绿分量
*pbyRed=gray;//将取到最大值赋给像素红分量
}
for(intj=height/3;j<2*height/3;j++)//每行
for(inti=0;i{
inta=*p_data;//获得当前点值
*p_data=255-a;//取反
p_data++;//指向下一指针
}
for(intj=2*height/3;jfor(inti=0;i{
BYTE*pbydata=p_data++;//获得当前点值
BYTEa=*pbydata;//传给暂时变量
*pbydata=(a>128)?
a:
(255-a);//调节
}
}
2.目的物体轮廓提取。
规定:
(1)获取原图像像素首地址,及图像高和宽;
(2)开辟一块内存缓冲区,存储解决后图像像素;
(3)计算图像平均灰度值,以平均灰度值作为阈值T;
(4)对图像进行二值化预解决,像素灰度值不不大于T置白,否则置黑;
(5)将像素点8邻域像素读入数组中,如果8个邻域像素都和中心点相似,在内存缓
区将该像素点置白,否则保持不变;
(6)重复执行(3),对每一种像素进行解决;
(7)将解决后图像数据复制到原图像中。
voidBingXingBianJieDib:
:
Lunkuotiqu()
{
LPBYTEp_data,lpSrc;
intwide,height;
inti,j;
intn1,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{
for(i=0;i{
if(*p_data>128)
*p_data=255;
else
*p_data=0;
p_data++;
}
}
p_data=lpSrc;
LPBYTEtemp=newBYTE[wide*height];
memset(temp,255,sizeof(temp));
for(j=1;jfor(i=1;i{
if(p_data[j*wide+i]==0)
{
temp[j*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_data[j*wide+i-1];
n5=p_data[j*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)
temp[j*wide+i]=255;
}
}
memcpy(lpSrc,temp,wide*height);
deletetemp;
}
3.编程实现分别记录24位真彩色图像R、G、B直方图。
规定:
本程序功能是对24位真彩色图像R、G、B分别进行直方图记录,R、G、B分布密度分别放在数组tongji_RED[],tongji_GREEN[],tongji_BLUE[]里。
请将程序代码补充完整。
voidHuiDuBianHuanDib:
:
ZhiFangTu(float*tongji_RED,float*tongji_GREEN,float*tongji_BLUE)
{
inti,j;
intwide,height;
LPBYTEp_data;
p_data=this->GetData();
height=this->GetHeight();
wide=this->GetWidth();
}
4.依照构造
编程实现图像闭运算。
规定:
(1)得原图像首地址及图像宽和高。
(图像已经二值化,背景为白,物体为黑)。
(2)辟一块内存缓冲区,并初始化为255。
(3)定义一种构造数组B[9]。
B[9]=
(4)为防越界,不解决最左边、最右边、最上边和最下边四边像素,从第2行第2列开始进行闭运算。
(5)循环环节4,直到解决完原图所有像素点。
(6)将成果从内存复制到原图数据区。
voidFuShiYuPengZhangDib:
:
Onfushi()
{
inti,j,m,n;
LPBYTEp_data;
LPBYTElpSrc;
LPBYTElpDst;
LPBYTEtemp;
p_data=GetData();
LONGwide=GetWidth();
LONGheight=GetHeight();
temp=newBYTE[wide*height];
lpDst=(LPBYTE)temp;
memset(lpDst,(BYTE)255,wide*height);
//3×3构造元素
intB[9]={1,0,1,
0,0,0,
1,0,1};
//使用全方向构造元素进行腐蚀
for(j=1;jfor(i=1;i{
//由于使用3×3构造元素,为防止越界,因此不解决最左、右、上、下四//边像素
//指向源图像倒数第j行,第i个象素指针
lpSrc=(unsignedchar*)(p_data+wide*j+i);
//指向目的图像倒数第j行,第i个象素指针
lpDst=(unsignedchar*)(temp+wide*j+i);
//目的图像中当前点先赋成黑色
*lpDst=0;
//如果源图像中3×3构造元素相应位置有白点
//则将目的图像中(0,0)点赋成白色
for(m=0;m<3;m++)
for(n=0;n<3;n++)
{
if(B[m+n]==1)
continue;
if(*(lpSrc+(1-m)*wide+(n-1))>128)
{
*lpDst=255;
break;
}
}
}
memcpy(p_data,temp,wide*height);
deletetemp;
}
5.编程实现图像渐隐。
规定:
显示一幅位图,像素浓度由亮到暗,逐渐削弱,直至全黑。
请写出渐隐程序代码。
voidCDynSplitView2:
:
OnJianyin()
{
CDC*pDC=GetDC();
CRectrect(0,0,1000,1000);
CBrushbrush(RGB(255,255,255));
pDC->FillRect(&rect,&brush);
clearmem();
CDSplitDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
if(!
pDoc->statedoc&&state2==1)
{
BYTE*pBitmapData=CDibNew1->GetData();
LPBITMAPINFOpBitmapInfo=CDibNew1->GetInfo();
intbitmapHeight=CDibNew1->GetHeight();
intbitmapWidth=CDibNew1->GetWidth();
if(CDibNew1->GetRGB())//Hasacolortable
{
CPalette*hPalette=CreateBitmapPalette(CDibNew1);
CPalette*hOldPalette=pDC->SelectPalette(hPalette,true);
pDC->RealizePalette();
LPBYTEtemp,temp1,temp2;
temp=newBYTE[CDibNew1->GetHeight()*CDibNew1->GetHeight()];
memset(temp,0,CDibNew1->GetHeight()*CDibNew1->GetHeight());
for(intn=0;n<=256;n++)
{
temp1=temp
temp2=pBitmapData
for(intj=0;j{
for(inti=0;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);
deletetemp;
}
}
}
6.对灰度图像进行N×N十字型中值滤波解决。
规定:
(1)获得图像大小、数据区,并把数据区复制到缓冲区中;
(2)获得N值;
(3)循环获得各点像素值;
(4)对以该点为中心N*N十字型屏蔽窗口涉及各像素值进行排序,得到中间值;
(5)把该点像素值置为中间值;
(6)把缓冲区中改动数据复制到原数据区中。
voidZaoShengXiaoChuDib:
:
nnzhong(intn)
{
DWORDsize;
size=GetSize();
BYTE*p_temp=newBYTE[size];
memset(p_temp,255,size);
intyy,xx,n2,nn,chuo,chg,m,medi,madom,mado[1000];
BYTE*p_data;
intwide,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(intj=n2;jfor(inti=n2;i{
m=0;
for(yy=j-n2;yy<=j+n2;yy++)
{
mado[m]=p_data[yy*wide+i];
m++;
}
for(xx=i-n2;xx<=i+n2;xx++)
{
if(xx==i)continue;
mado[m]=p_data[j*wide+xx];
m++;
}
}
//把mado[m]中值按下降顺序用冒泡法排序
do{
chg=0
for(m=0;m{
if(mado[m]{
madom=mado[m];
mado[m]=mado[m+1];
mado[m+1]=madom;
chg=1;
}
}
}while(chg==1);
medi=mado[chuo];
p_temp[j*wide+i]=medi;
}
memcpy(p_data,p_temp,size);
deletep_temp;
}
7.编程实现灰度图像伪彩色解决。
规定:
修改颜色索引表,将灰度图像显示成彩色图像。
将灰度区间表达到如下5种典型颜色:
[0,50]表达到:
黑色;[51,100]表达到:
蓝色;
[101,150]表达到:
红色;[151,200]表达到:
黄色;
[201,255]表达到:
绿色。
CPalette*CDynSplitView2:
:
CreateBitmapPalette(CDib*pBitmap)
{
struct
{
WORDVersion;
WORDNumberOfEntries;
PALETTEENTRYaEntries[256];
}palette={0x300,256};
LPRGBQUADpRGBTable=pBitmap->GetRGB();
UINTnumberOfColors=pBitmap->GetNumberOfColors();
for(UINTx=0;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.aEntries[x].peRed=pRGBTable[x].rgbRed;
palette.aEntries[x].peGreen=pRGBTable[x].rgbGreen;
palette.aEntries[x].peBlue=pRGBTable[x].rgbBlue;
palette.aEntries[x].peFlags=0;
}
//hPalette已在视类定义
hPalette.CreatePalette((LPLOGPALETTE)&palette);
return&hPalette;
}
8.中值滤波是指将当前像元窗口(或领域)中所有像元灰度由小到大进行排序,中间值作为当前像元输出值,试编程实现3×3中值滤波。
原始图像某些数据为:
LPBYTEp_data;
p_data=GetData();
LONGwide=GetWidth();
LONGheight=GetHeight();
答:
intm;
for(intj=1;jfor(inti=1;i{
for(intyy=j-1;yy<=j+1;yy++)
for(intxx=i-1;xx<=i+1;xx++)
{
intmado[m]=p_data[yy*wide+xx];
m++;
}
do
{
intchg=0;
for(m=0;m<8;m++)
{
if(mado[m]{
intmadom=mado[m];
mado[m]=mado[m+1];
mado[m+1]=madom;
chg=1;
}
}
}while(chg==1)
intmedi=mado[4];
p_data[j*wide+i]=medi;
}
9.完毕对一幅宽为wide,高为height灰度图像进行垂直镜像变换程序。
原始图像某些数据为:
LPBYTElpSrc;//指向源图像指针
LPBYTEp_data;//指向要复制区域指针
LPBYTElpDst;//指向复制图像指针
longheight=this->GetHeight();//图像高与宽
longwide=this->GetWidth();
p_data=this->GetData();
答:
LPBYTEtemp;
LONGi;//循环变量
LONGj;
temp=newBYTE[wide*height];//暂时分派内存,以保存一行图像
//针对上半图像进行操作
for(i=0;i{
for(j=0;j{
lpSrc=(LPBYTE)p_data+wide*j+i;
lpDst=(LPBYTE)temp+wide*(height-j-1)+i;
*lpDst=*lpSrc;
}
}
memcpy(p_data,temp,wide*height);
//释放内存
deletetemp;
10.将图像中红色球体进行左右、上下、对称复制。
原图解决后图像
voidTuXianFuZhiDib:
:
Onfuzhi()
{
LPBYTEp_data;
p_data=GetData();
LONGwide=GetWidth();
LONGheight=GetHeight();
}
11.编程实现24位彩色图像进行解决。
规定:
将24位彩色图像平均提成三个等高区域,对这三个区域分别进行灰度化解决、逆反解决、曝光解决。
(1)对第一种区域进行灰度变换。
Gray(i,j)=0.11R(i,j)+0.59G(i,j)+0.3B(i,j)
(2)对第二个区域进行逆反解决。
(3)对第三个区域进行曝光解决。
voidMakeColorDib:
:
MakegChange()
{
BYTE*p_data;
intwide,height,DibWidth;
p_data=this->GetData();
wide=this->GetWidth();
height=this->GetHeight();
DibWidth=this->GetDibWidthBytes();
for(intj=0;jfor(inti=0;i<;)
{
BYTE*pbyBlue=p_data++;//得到蓝色值
BYTE*pbyGreen=p_data++;//得到绿色值
BYTE*pbyRed=p_data++;//得到红色值
BYTEr=*pbyRed;
BYTEg=*pbyGreen;
BYTEb=*pbyBlue;
gray=0.11*r+0.59*g+0.3*b
*pbyBlue=gray;//将取到最大值赋给像素蓝分量
*pbyGreen=gray;//将取到最大值赋给像素绿分量
*pbyRed=gray;//将取到最大值赋给像素红分量
}
for(intj=height/3;j<2*height/3;j++)//每行
for(inti=0;i{
inta=*p_data;//获得当前点值
*p_data=255-a;//取反
p_data++;//指向下一指针
}
for(intj=2*height/3;jfor(inti=0;i{
BYTE*pbydata=p_data++;//获得当前点值
BYTEa=*pbydata;//传给暂时变量
*pbydata=(a>128)?
a:
(255-a);//调节
}
}
12.彩色图像RGB颜色模型转换为YUV颜色模型。
YUV颜色模式,这是电视系统中惯用颜色模式,即电视中所谓分量(Component)信号。
该模式1个亮度信号Y和两个色差信号U、V构成。
它是运用了人眼对亮度信号敏感而对色度信号相对不敏感特点,将RGB颜色通过亮度信号公式Y=0.29R+0.50G+0.11B转换为一种亮度信号Y和两个色差分量信号U、V,即对色差信号进行了频带压缩。
RGB变换为YUV坐标转换公式如下:
Y0.2990.5870.114R
U=-0.1678-0.33130.5G
V0.5-0.4187-0.0813B
将转换后YUV信