昆明理工大学数字图像处理课程综合报告(大作业)

  • 格式:docx
  • 大小:4.37 MB
  • 文档页数:45

数字图像处理课程综合报告学生姓名:xxx学号:2012xxxxxxxx学院:理学院专业年级:2012级电子信息科学与技术指导老师:桂进斌目录实验二:反色与二值化: (3)实验三:灰度变换 (5)线性变化 (8)指数变化 (9)对数变换 (11)实验四:图像几何变换 (12)图像平移 (15)图像旋转 (17)水平镜像 (20)垂直镜像 (21)实验五:直方图均衡化 (22)实验六:图像的平滑与锐化 (25)均值滤波 (27)中值滤波 (29)梯度锐化 (32)Sobel算子锐化 (33)实验七:彩色图像处理 (34)读取R分量 (34)读取G分量 (36)读取B分量 (38)实验八:图像频域高通和低通滤波变换 (40)低通滤波 (41)高通滤波 (44)实验二:反色与二值化:图像的反色就是依次求出每个像素点的补色,由于用的是256位的图像,所以只需要使用255减去原本像素的色值即可。

图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。

在实验前期开发环境框架的搭建中就已经拿到图像在内存中的首地址存于Imgdata指针中,并开辟了一个用于存放处理后数据的内存空间Imgdata_tmp。

在以后的图像处理算法中只需要直接对Imgdata指向的数据进行处理,并把处理结果存放在Imgdata_tmp中即可。

实现代码:void MyBmp::Binaryzation(CDC *pDC){//binaryzation二值化if(m_DibHead==NULL)MessageBox(NULL,"获取文件头失败!","错误",MB_OK);if(m_hPalette!=NULL){HDC hdc=pDC->GetSafeHdc();::SelectPalette(hdc,m_hPalette,TRUE);}pDC->SetStretchBltMode(COLORONCOLOR);int x = m_DibHead->biWidth;int y = m_DibHead->biHeight;TmpBmp = new unsigned char[m_ImageSize];memset(TmpBmp,255,x*y);char temp;int ccc = 0;for (int i = 0;i<y; ++i)//行数for (int j = 0;j<x;++j){ccc++;temp = *(m_Image+i*x+j);if ((10*temp+10)>=255){TmpBmp[i*x+j] = (char)255;}elseTmpBmp[i*x+j] = 0;}//memcpy(m_Image,TmpBmp,x*y);二值化效果:char temp;for (int i = 0;i<y; ++i)//行数for (int j = 0;j<x;++j){temp = m_Image[i*x+j];TmpBmp[i*x+j] = 255 - temp;}//memcpy(m_Image,TmpBmp,x*y);::StretchDIBits(pDC->GetSafeHdc(),500,0,((400<=(m_DibHead->biW idth))?400:(m_DibHead->biWidth)),((400<=(m_DibHead->biHeight))?400:(m_DibHead->biHeight)),0,0, m_DibHead->biWidth,m_DibHead->biHeight,TmpBmp,(LPBITMAPINFO)m_DibHead,DIB_RGB_COLORS,SRCCOPY);delete[] TmpBmp;TmpBmp = NULL;}反色效果:实验三:灰度变换灰度线性变换是灰度变换的一种,图像的灰度变换通过建立灰度映射来调整源图像的灰度从而达到图像增强的目的。

灰度映射通常是用灰度变换曲线来表示的,如图 7所示。

灰度线性变换就是将图像的像素值通过指定的线性函数进行变换,以此增强或者减弱图像的灰度。

灰度线性变换的公式就是常见的一维线性函数:g(x, y)=kf(x, y)+d设x为原始灰度值,则变换后的灰度值y为:也可以在坐标系中表示转化关系,如图 7所示。

图 7 灰度线性变换图 7坐标中的横轴表示输入灰度值,范围是0至 255;纵坐标表示输出灰度值,范围同样是0至255;直线则为线性变换函数的图形。

如果将输入灰度值作为自变量x,则输出的灰度值就是函数y=T(x) 的运算结果。

对于线性变换而言,有T(x)=kx+d。

例如图 7中的变换函数为T(x)=x,即原公式中的k=1,d=0。

由数学知识可以知道k表示直线的斜率,也就是倾斜程度;d为线性函数在y 轴的斜率。

下面通过讨论k的取值来分析灰度线性变换的效果。

1)当k>1时此时可用于增加图像的对比度。

图像的像素值在变换后全部增大,整体显示效果被增强,如图 8所示。

图 8 变换后的图像、对应变换函数和直方图可以看到,图像经过变换后,其灰度分布被拉伸了。

读者可以与图 1中的直方图进行比较。

2)当k=1时这种情况常用于调节图像亮度。

亮度的调节就是让图像的各像素值都增加或者减少一定量。

这种情况下可以通过改变d的值达到增加或者减少图像亮度的目的,如图 9所示。

图 9 利用线性变换改变图像亮度可以看到,当d>0时图像亮度增加,反之则减少。

对应直方图的显示效果是灰度分布整体向右或者向左平移。

3)当0<k<1时效果与k>1 时刚刚相反,图像的对比度和整体效果都被削弱。

从图 10中的直方图可以看到,灰度分布被集中在一段区域上。

k越小,图像的灰度分布越窄,图像看起来也就越偏灰色。

图 10 利用线性变换改变图像对比度4)当k<0时在这种情况下,源图像较亮的区域变暗,而较暗的区域会变亮。

此时可以使函数中的k=-1,d=255让图像实现反色效果,如图 11所示。

图11 利用线性变换让图像反色代码实现线性变化MyBmp::LinearTrans(CDC *pDC,int a,int b){//LinearTrans线性变化if(m_DibHead==NULL)MessageBox(NULL,"获取文件头失败!","错误",MB_OK);if(m_hPalette!=NULL){HDC hdc=pDC->GetSafeHdc();::SelectPalette(hdc,m_hPalette,TRUE);}pDC->SetStretchBltMode(COLORONCOLOR);int x = m_DibHead->biWidth;int y = m_DibHead->biHeight;TmpBmp = new unsigned char[m_ImageSize];memset(TmpBmp,255,x*y);for (int i = 0;i<y; ++i)//行数for (int j = 0;j<x;++j){if ((a*m_Image[i*x+j]+b)>=255){TmpBmp[i*x+j] = 255;}elseTmpBmp[i*x+j] = a*m_Image[i*x+j]+b;}//memcpy(m_Image,TmpBmp,x*y);::StretchDIBits(pDC->GetSafeHdc(),500,0,((400<=(m_DibHead->biW idth))?400:(m_DibHead->biWidth))线性变换效果:指数变化memset(TmpBmp,255,x*y);for (int i = 0;i<y; ++i)//行数for (int j = 0;j<x;++j){double e = a;int m = m_Image[i*x+j];if ( (pow( e,m ))>=255 ){TmpBmp[i*x+j] = 255;}elseTmpBmp[i*x+j] = 100*pow( 1.0,m);}//memcpy(m_Image,TmpBmp,x*y);::StretchDIBits(pDC->GetSafeHdc(),500,0,((400<=(m_DibHead->biW idth))?400:(m_DibHead->biWidth)),((400<=(m_DibHead->biHeight))?400:(m_DibHead->biHeight)),0,0, m_DibHead->biWidth,m_DibHead->biHeight,TmpBmp,(LPBITMAPINFO)m_DibHead,DIB_RGB_COLORS,SRCCOPY);delete[] TmpBmp;TmpBmp = NULL;}指数变换效果:对数变换void MyBmp::Log10(CDC *pDC){if(m_DibHead==NULL)MessageBox(NULL,"获取文件头失败!","错误",MB_OK);if(m_hPalette!=NULL){HDC hdc=pDC->GetSafeHdc();::SelectPalette(hdc,m_hPalette,TRUE);}pDC->SetStretchBltMode(COLORONCOLOR);int x = m_DibHead->biWidth;int y = m_DibHead->biHeight;TmpBmp = new unsigned char[m_ImageSize];memset(TmpBmp,255,x*y);for (int i = 0;i<y; ++i)//行数for (int j = 0;j<x;++j){float m = m_Image[i*x+j]*1.0;TmpBmp[i*x+j] =50*log( static_cast<float>(m_Image[i*x+j]) );}//memcpy(m_Image,TmpBmp,x*y);::StretchDIBits(pDC->GetSafeHdc(),500,0,((400<=(m_DibHead->biW idth))?400:(m_DibHead->biWidth)),((400<=(m_DibHead->biHeight))?400:(m_DibHead->biHeight)),0,0, m_DibHead->biWidth,m_DibHead->biHeight,TmpBmp,(LPBITMAPINFO)m_DibHead,DIB_RGB_COLORS,SRCCOPY);delete[] TmpBmp;TmpBmp = NULL;}对数变换效果:实验四:图像几何变换图像几何变换的一般表达式:[u,v]为变换后图像像素的笛卡尔坐标,[x,y]为原始图像中像素的笛卡尔坐标。