当前位置:文档之家› 2015数字图像处理实验一 基础实验

2015数字图像处理实验一 基础实验


实验一:
6、已知序列图像中相邻两幅图像A(up.jpg)、B(down.jpg) ,其坐标分别为(u,v)及(x,y),试求其图像变换校 正二阶拟合方程式系数K。要求用最小二乘法求解,变换 模型为: x = k100+ k110u + k101v+ k120u2+ k102v2+ k111uv y = k200+ k210u + k201v+ k220u2+ k202v2+ k211uv 提示:up.jpg不动, down.jpg做变换、旋转,图中给出大 于7个以上标记点,坐标自己读出。 7、编程实现大津阈值分割算法,对给定待分割图像进行 阈值分割。 8、对一幅灰度图像实现压缩编码,要求在Huffman码、 行程编码、变换编码等中至少选择两种方式编程实现。
傅立叶变换
噪 声
傅立叶变换
FFT 原始图像 显示:频谱图
求模 复数(实部+虚部)
去噪时:应当对傅立叶变换后的复数进行修改 (即,实部和虚部的数值都需要修改)
傅立叶变换
“transform.cpp”: 在void fft2D(unsigned char* imgBuf, int width, int height)中直接修改频谱 //频域数据保存至fftBuf fftBuf=buf; //带阻去噪 for (i=height/2-5; i<=height/2+5;i++){ for (j=width/2-10; j<= width/2-5;j++){ *(fftBuf+i*width*2+j*2+0)=0; *(fftBuf+i*width*2+j*2+1)=0; } for(j=width/2+5; j<= width/2+10;j++){ *(fftBuf+i*width*2+j*2+0)=0; *(fftBuf+i*width*2+j*2+1)=0; } } *(fftBuf+i*width*2+j*2+0) =*(fftBuf+i*width*2+j*2+0)/10; *(fftBuf+i*width*2+j*2+1) =*(fftBuf+i*width*2+j*2+1)/10;
加噪声
增强噪声频谱
傅立叶变换
傅立叶变换
高通滤波
高频:细节描述(边缘, 噪声)
傅立叶变换
低频:轮廓部分
低通滤波
思考题
1. 观察laplace、Roberts、Sobel、Kirch等算子 对边界检测的特点; 2. 如何实现彩色图像的边缘检测? 3. 傅里叶变换有哪些重要的性质,讨论图像的边 缘与频率的关系? 4. 当图像不满足N*N时,如何对图像补0,实现 其快速傅立叶变换?
f f
T
2 2 12 f ( x, y ) mag (f ( x, y )) (G x Gy )
梯度的方向: ( x, y ) arctan(G y G x ) 在离散域中,用差分代替微分来实现:
f ( x , y ) f x, y f x 1, y f x, y f x, y 1
边缘检测
边缘检测
//获取文档类中m_dib的指 针,访问当前DIB数据 //获取图像宽、高、每像素所占位数 //输入的图像每行像素所占字节数,必须为4的倍数
Doc文档,负责内存数据与磁盘的交互:读入,写盘。 View视图,负责内存数据与用户的交互:数据的显示、用户操作的响应(如菜单 的选取、鼠标的响应等等)
2

1 2 2

边缘检测
常用边缘检测算子: a) Roberts算子
ቤተ መጻሕፍቲ ባይዱ
gi, j f i, j f i 1, j 1 f i 1, j f i, j 1
2

1 2 2

近似式:
f (i, j ) f (i 1, j 1) f (i 1, j ) f (i, j 1)
傅立叶变换
void CDemoView::OnFft() { CDemoDoc *pDoc=GetDocument(); HDIB dib=pDoc->GetHDIB(); LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib); LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB; int w = phead->biWidth; int h = phead->biHeight; int b = phead->biBitCount/8; if(b==3) { ::MessageBox(0,“只处理灰度图象! ",NULL,MB_OK); ::GlobalUnlock(dib); return; } int lineByte=(w * b+3)/4*4; unsigned char *lpDIBBits =(unsigned char *)::FindDIBBits(lpDIB); int bufLong=w; if(h>bufLong) bufLong=h; unsigned char *buf=new unsigned char[bufLong*bufLong]; int i, j; for(i=0;i<h;i++){ for(j=0;j<w;j++) buf[i*w+j]=*(lpDIBBits+i*lineByte+j); for(j=w;j<bufLong;j++) buf[i*w+j]=0; } for(i=h;i<bufLong;i++){ for(j=w;j<bufLong;j++) buf[i*w+j]=0; } fft2D(buf, bufLong, bufLong); for(i=0;i<h;i++){ for(j=0;j<w;j++){ *(lpDIBBits+i*lineByte+j)=buf[i*bufLong+j]; } } delete []buf; ::GlobalUnlock(dib); ifft2D(buf, bufLong, bufLong); Invalidate(); }
transform.cpp、transform.h
面向过程的DIB读写访问
傅立叶变换
将傅立叶变换函数加入所建立的工程 建立菜单项 注意:头文件是否包含进去
例如,用已有傅立叶变换函数做FFT变换时, 需要在DemoView.cpp里添加如下头文件
#include"math.h" #include "MainFrm.h" #include "transform.h"
抑制 噪声频谱
去噪
傅立叶变换
存储傅立叶变换后的数据 transform.cpp: float *buf1=new float[n*2]; 另一种方法 FFT.cpp: //复数类型结构体 struct ComplexNumber { float imag; // imaginary虚部 float real; //实部 }; //傅立叶变换缓冲区 ComplexNumber *m_pFFTBuf; //去噪 for(…;…;…){ for(…;…;…){ m_pFFTBuf[i*width+j].imag=0; m_pFFTBuf[i*width+j].real=0; } … }
边缘检测
1. 在已有函数中加入边缘检测算子,观察图像处理前后的 变化; 2.自己尝试加入新的菜单并映射函数,实现新的边缘检 测算子;
边缘检测
边缘检测
Message Maps选项卡: 是ClassWizard对话框中最重要的 选项卡,主要完成创建新类、添加、 删除消息处理函数等任务。
边缘检测
傅立叶变换
傅立叶变换
//加正弦波 for(j=width/2-5; j<= width/2+5;j++){ for(i=height/2-25; i<=height/2-20;i++){ *(fftBuf+i*width*2+j*2+0)=*(fftBuf+i*width*2+j*2+0)*30; *(fftBuf+i*width*2+j*2+1)=*(fftBuf+i*width*2+j*2+1)*30; } for(i=height/2+20; i<=height/2+25;i++){ *(fftBuf+i*width*2+j*2+0)=*(fftBuf+i*width*2+j*2+0)*30; *(fftBuf+i*width*2+j*2+1)=*(fftBuf+i*width*2+j*2+1)*30; } }
实验一:
独立完成以下8道题的编程实现: 1、实现laplace算子、Roberts算子、Sobel算子、Kirch算 子等边缘检测算子中的任何两个,对灰度图像处理。 2、对一幅有规则噪声的灰度图像(grid.bmp)作快速付立 叶变换,在频谱上去除规则噪声的频带,然后作快速付立叶 反变换恢复原图像,观察去噪效果,尝试自己生成噪声。 3、对一幅彩色图像进行近邻、双线性、三次立方卷积放大 ,放大倍数2、3、4倍。 4、用3*3,5*5,7*7模板实现均值和中值图像平滑,测试 效果和处理速度。 5、对一幅灰度图像进行直方图均衡、线性拉伸等变换。
相关主题