DSP图像处理算法的实现
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DSP图像处理的原理介绍
2.相关函数: a.公式:
R fh (t ) = f (t ) ∗ h(t ) = ∑ f (τ )h(t − τ )
τ
b.算法实现图(举例: 3×3相关运算):
input(x,y) mask(i,j) output(x,y)
×
2 2
=
c.算法实现:output (x, y ) = ∑ ∑ input (x + i, y + j )× mask (i, j ) i =0 j =0
• 3×3相关运算处理后图像:
• 程序中要求输出图像为32位,但是在本次设计 中,图像都是用8位来显示的,因此实验结果只是 黑白图像。
验证结果的正确性
以下情况,output(x,y) = 0
以下情况,output(x,y) = 65025
以下情况,output(x,y) =130050
以下情况,output(x,y) =195075
DSP图像处理的原理介绍
1.离散卷积: a.公式:
y (i ) = u (t ) ∗ h(t ) = ∑ u ( j )h(i − j )
j
b.算法实现:使用一个模板mask(大小可以是 3×3,5×5或7×7等),依次覆盖在要处理图像的 各个像素上,模板中心与该像素重合;模板上的各 个元素均有其自身的权值,将模板各元素权值与覆 盖在其下的像素值分别相乘后求和,然后进行相应 的处理,最后将此所得结果赋给当前处理的像素。
DSP图像处理算法的 实现
答辩人:黄德天 学号:04140021 系别:电子工程系 指导教师:杨涛教授
主要研究工作
• 基于标准C,设计通用的基本图像处理算 法,并在此基础上,考虑最通用的DSP结构 的优化要求来细化C语言的程序结构,优化 程序的实现方法。本设计完成了图像处理 中,卷积、相关和中值滤波运算的算法实 现;基于TI公司的TMS320C6000硬件平 台的结构特点,本设计采用的算法优化方法 包括:使用编译器选项、内联函数和字访问 短型数据、软件流水和循环展开等。
利用循环展开和软件流水的程序优化方法实现:
//processing the image
for(irows = 1;irows < aSz.height +1;irows++){ for(icols = 1;icols <= aSz.width + 1;icols++){ sum = 0; sum += temp_ptr->pData[(irows -1) * temp_aSz.width + icols - 1] *mask[0]; sum += temp_ptr->pData[(irows -1) * temp_aSz.width + icols] * mask[1]; sum += temp_ptr->pData[(irows -1) * temp_aSz.width + icols + 1] * mask[2]; sum += temp_ptr->pData[(irows) * temp_aSz.width + icols - 1]* mask[3]; sum += temp_ptr->pData[(irows) * temp_aSz.width + icols] * mask[4]; sum += temp_ptr->pData[(irows) * temp_aSz.width + icols +1] * mask[5]; sum += temp_ptr->pData[(irows +1) * temp_aSz.width + icols - 1]* mask[6]; sum += temp_ptr->pData[(irows +1) * temp_aSz.width + icols] * mask[7]; sum += temp_ptr->pData[(irows +1) * temp_aSz.width + icols + 1]* mask[8]; } outptr->pData[(irows -1) * aSz.width + (icols -1)] = sum; }
• 输入图像:一幅8位无符号图像(8行8列), 黑色部分的像素值为0,白色部分的像素值 为255;对它进行相关运算,要求输出图像 为32位的图像。
输入图像
标准C代码的部分程序:
//processing the image
for(irows = 1;irows < aSz.height +1;irows++) { for(icols = 1;icols <= aSz.width + 1;icols++) { sum = 0; for (j = 0; j < 3; j++) { for (i = 0; i < 3; i++) { sum+= temp_ptr->pData[(irows+j1)*temp_aSz.widtபைடு நூலகம்+icols-1+i]*mask[j*3+i]; } } outptr->pData[(irows -1) * aSz.width + (icols -1)] = sum; } }
举例:3×3相关运算的算法实现
• 3×3相关运算的基本算法:
output ( x, y ) = ∑ ∑ input ( x + i, y + j ) × mask (i, j )
i =0 j =0 2 2
• mask的设置如下:
0 0 0 255 255 0 0 255 0
该mask的作用是实现图像边缘的检测。
• TMS320C6000提供了很多内联函数,它们直接映射为内 嵌C6000汇编指令的特殊函数,这样可迅速优化C语言代 码,内联函数用下划线“_”开头。返回
intrinsics _sadd _add _smpy _clr _smpyh _mpy _sshl _mpyh _ssub _sub _set
• 通过以上的计算可知,得到的实验结果是 正确的。
Thank you for your attention!
C6000优化方法-编译器选项
优化选项 作用 优化寄存器的使用 低 -o1 -o2或-o -o3 本地优化 全局优化 高 文件级优化 优化级别
优 化 器 选 项
-o0
有软件流水功能
返回
C6000优化方法-内联函数
返回
C6000优化方法-循环展开
• 循环展开可增加并行执行的指令类,当单次迭 代操作没有充分利用C6000结构的所有资源 时,可使用循环展开提高性能。编译器仅对内 部循环执行软件流水,因此,为了提高性能可 创造一个比较大的内循环。创造大的内循环的 方法就是完全展开执行周期很小的内循环。
返回
C6000优化方法-软件流水
DSP图像处理的原理介绍
3.中值滤波 中值滤波是一种非线性滤波,对像素领 域内灰度的中值代替该像素的值,即:
g ( x, y ) = Median[x1 , x2 ,…, xn ]
其中:x1 , x2 ,…, xn 为点及其领域。
程序优化的基本流程
• 第l阶段:直接根据需要用高级C语言实现DSP功 能,测试代码的正确性。然后,移植到C6000平 台,利用C6000开发环境Profile测试程序的运行 时间。若不满足要求,则进入下一阶段。 • 第2阶段:利用C6000提供的优化方式和其他各种 优化技巧,如使用:编译器选项、内联函数、字 访问短型数据、软件流水、循环展开等,优化C语 言代码。如果还不能满足要求,则进入第3阶段。 • 第3阶段:将C语言代码中耗时最长的部分抽取出 来,用线性汇编语言重写,用汇编优化器进行优 化。使用profile确定这段代码是否需要进一步优 化。
软件流水是用来安排循环指令,使循环的多次迭代 同时执行的一种技术。图3是一个循环代码的软件 流水示意图。图中A,B,C,D和E表示特别迭 代,其后的数字表示各次迭代的第几条指令,同一 行中的指令是同一周期内并行执行的指令。 返回
常用Intrinsics列表
C6000优化方法-字访问短型数据
• 以“利用32位字访问16位数据”为例:在作 16位short类型数据的点积运算时,由于 C6000的内部数据总线和寄存器都是32位 的, 因此可以采用字长优化的方法进行优化。 具体做法是在做点积运算时, 每次用1个LD 指令取2个16位数据, 并进一步用C6000的 2个16位乘法器在1个周期内并行完成2个 16位乘法。这样, 就有可能进一步提高点 积运算速度。