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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

transform.cpp、transform.h
面向过程的DIB读写访问
傅立叶变换
将傅立叶变换函数加入所建立的工程 建立菜单项 注意:头文件是否包含进去
例如,用已有傅立叶变换函数做FFT变换时, 需要在DemoView.cpp里添加如下头文件
#include"math.h" #include "MainFrm.h" #include "transform.h"
加噪声
增强Biblioteka Baidu声频谱
傅立叶变换
傅立叶变换
高通滤波
高频:细节描述(边缘, 噪声)
傅立叶变换
低频:轮廓部分
低通滤波
思考题
1. 观察laplace、Roberts、Sobel、Kirch等算子 对边界检测的特点; 2. 如何实现彩色图像的边缘检测? 3. 傅里叶变换有哪些重要的性质,讨论图像的边 缘与频率的关系? 4. 当图像不满足N*N时,如何对图像补0,实现 其快速傅立叶变换?
1 0 0 -1 0 -1 1 0
Roberts算子
边缘检测
b) Sobel算子
-1 -2 -1 0 0 0 1 2 1 1 0 -1 2 0 -2 1 0 -1
c) Prewitt算子
-1 -1 -1 0 0 0 1 1 1 1 0 -1 1 0 -1 1 0 -1
边缘检测
傅立叶变换
了解图像傅立叶变换的旋转、平移等特性
边缘检测
0 -1
1 0
1 0
0 -1
边缘检测
图像中的边缘是图像局部特性不连续(或突变)的结果。
(b) 每行像素的 灰度剖面图
0
(a) 一幅纵向 边缘的图像
0
(c) 一阶导数 (d) 二阶导数
0
边缘检测原理:利用图像一阶导数的极值或二阶导数的过零 点信息来判断边缘。
边缘检测
梯度对应一阶导数,对于一个连续图像函数f(x,y): 梯度矢量定义: f ( x, y ) G x G y T x y 梯度的幅度:
边缘检测
边缘检测
//获取文档类中m_dib的指 针,访问当前DIB数据 //获取图像宽、高、每像素所占位数 //输入的图像每行像素所占字节数,必须为4的倍数
Doc文档,负责内存数据与磁盘的交互:读入,写盘。 View视图,负责内存数据与用户的交互:数据的显示、用户操作的响应(如菜单 的选取、鼠标的响应等等)
傅立叶变换
在已有快速傅立叶变换函数基础上,修改 变换后的频谱数据,实现图像的频域平滑 去噪; 对频谱数据进行处理,尝试实现理想低通、 正弦波载入等操作。
傅立叶变换
两种方法:
FFT.cpp、 FFT.h
Transform_FFT,以ImgCenterDib为基类派生,面向对象的 DIB读写访问 《Visual C++数字图像处理》P171——190 使用ImgCenterDib进行可视化编程《Visual C++数字图像处 理》P42
实验内容:
序 号 实验 性质 备注 实验内容 实验形式 要求 学时 必 做 √ 选 做
1
基础
图像处理基本算 法的实现 细胞图像的分割 与测量 任选一题
自行编程实现
1人/组
3
2
综合
自行编程实现 阅读文献,算法 设计,编程实 现,
1人/组 2人/组
3
√ √
3
开放
3
数字图像处理——基础实验
图像处理的基本算法
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)
傅立叶变换
噪 声
傅立叶变换
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;
实验一:
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码、 行程编码、变换编码等中至少选择两种方式编程实现。
实验一:
独立完成以下8道题的编程实现: 1、实现laplace算子、Roberts算子、Sobel算子、Kirch算 子等边缘检测算子中的任何两个,对灰度图像处理。 2、对一幅有规则噪声的灰度图像(grid.bmp)作快速付立 叶变换,在频谱上去除规则噪声的频带,然后作快速付立叶 反变换恢复原图像,观察去噪效果,尝试自己生成噪声。 3、对一幅彩色图像进行近邻、双线性、三次立方卷积放大 ,放大倍数2、3、4倍。 4、用3*3,5*5,7*7模板实现均值和中值图像平滑,测试 效果和处理速度。 5、对一幅灰度图像进行直方图均衡、线性拉伸等变换。
傅立叶变换
傅立叶变换
//加正弦波 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; } }
边缘检测
1. 在已有函数中加入边缘检测算子,观察图像处理前后的 变化; 2.自己尝试加入新的菜单并映射函数,实现新的边缘检 测算子;
边缘检测
边缘检测
Message Maps选项卡: 是ClassWizard对话框中最重要的 选项卡,主要完成创建新类、添加、 删除消息处理函数等任务。
边缘检测
傅立叶变换
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(); }
数字图像处理实验
李 露 C404 82316502/13466389864 E_mail: lilu@buaa.edu.cn 助教:卢亚楠 C307 13269788894
实验目的:
熟练掌握数字图像处理的基本算法 会编程实现基本的图像处理算法 会自己设计算法进行图像处理 提高动手能力和理论联系实际的能力 提高分析问题和解决问题的能力
抑制 噪声频谱
去噪
傅立叶变换
存储傅立叶变换后的数据 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; } … }
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
相关文档
最新文档