数字图像处理在DSP上的实现
通过DSP实现对数字图像的增强处理与应用分析

通过DSP实现对数字图像的增强处理与应用分析一、基本原理图像增强是指按特定的需要突出一幅图像中的某些信息,同时削弱或去除某些不需要的信息,它是一种将原来不清晰的图像变得清晰或强调某些感兴趣的特征,抑制不感兴趣的特征,使之改善图像质量、丰富信息量,加强图像判读和识别效果的图像处理方法。
图像增强技术基本上可分成两大类:频域处理法和空域处理法。
频域处理法的基础是卷积定理,它是将图像看作波,然后利用信号处理中的手段对图像波进行处理。
空域处理法的基础是灰度映射变换,它是直接针对图像中的像素进行处理,所用到的映射变换取决于增强的目的,例如增加图像的对比度,改善图像的灰度层次等处理均属于空域处理法的范畴。
线性空域锐化滤波法是一种经典且有效的图像增强技术。
最常用的线性空域锐化滤波器是一种线性高通滤波器,其工作原理在于让图像的低频分量受到抑制而不影响高频分量,由于低频分量对应于图像中灰度值缓慢变化的区域,和图像的整体特性无关,仅与图像整体对比度以及平均灰度值等有关系,所以该滤波器把这些分量滤去后,使得图像进一步锐化。
然后通过增强图像中被模糊的细节以达到目标和背景易于分离的目的。
在空域内进行滤波是利用模板和图像进行卷积来实现的,其主要步骤如下:(1)将模板在图像中漫游,实现模板的中心与图像中某个像素位置重合;(2)将模板上系数与模板下的图像的对应像素相乘;(3)将所有乘积的结果相加;(4)将相加之和(模板的输出响应)赋给图像中对应模板中心位置的像素。
例如图1(a)给出一幅原始图像的一部分,其中sx 表示像素的灰度值。
图1(b)是一个3X3 的模板,模板内的kn 表示为模板系数。
如将k0 所在位置与图像中灰度值为s0 的像素重合(即把模板中心放在图中的(x, y)位置),则模板的输出响应R 表示为:R=k0s0+k1s1+……+k8s8 并且把R 值赋给增强图,作为(x, y)位置处的灰度值,如图1(c)所示。
如果对原图像的每个像素都这样进行处理就可以得到所有位置增强后的新灰度值。
DSP的数字图像处理技术实现

《现代信号处理课程设计》课程设计报告设计题目 DSP的数字图像处理技术实现目录第一章绪论-----------------------------------------------31.1.1 课程设计目的及任务------------------------31.1.2 阈值分割的实现方法------------------------4 第二章视频采集与显示相关概念-----------------------------52.1 帧和场-------------------------------------------52.2 YCbCr及其采样格式--------------------------------5 第三章 DSP平台及软件开发---------------------------------73.1 DSP平台-----------------------------------------73.1.1 DSP发展简介-------------------------------73.1.2 TMS320F2812 DSP芯片简介-------------------83.2 F2812 DSP软件开发-------------------------------93.2.1 F2812 软件开发平台CCS---------------------93.2.2 F2812 DSP软件开发流程---------------------10 第四章阈值分割在MATLAB上的实现--------------------------12 第五章阈值分割在DSP上的实现----------------------------135.1 系统流程与实现方案------------------------------135.1.2 初始化模块--------------------------------145.1.3 图像阈值处理及输出模块--------------------165.2 工程中的主要库和文件(详见附录)-----------------185.2.1 工程中的库(.lib)--------------------------185.2.2 工程中的主要文件--------------------------185.3 程序运行及结果验证------------------------------19 附录:各源程序代码及其详细分析----------------------------20 总结----------------------------------------------------32第一章绪论1.1.1 课程设计目的及任务本课程设计教学所要达到的目的是:1)掌握如何使用DSP仿真平台;2)掌握DSP内部结构和工作原理;3)熟悉DSP的指令系统;4)熟悉用DSP实现各种基本算法。
基于DSP的数字图像处理系统的设计与实现

基于DSP的数字图像处理系统的设计与实现文:杨文胜李梅时间:2008—10-7 17:20:49安徽广电信息网络有限责任公司阜阳分公司摘要:为满足高数据量图像处理需求,提出并设计了以TMS320DM642为处理器的数字图像处理硬件系统,并在DSP/BIOS上配以实时图像处理软件系统,实现数字图像处理。
本文阐述了系统模块的构成、软件系统的设计,在此平台上,采集图像并运用优化算法对图像进行增强、分割、边缘检测,结果表明系统运行正常。
关键词:TMS320DM642 图像处理DSP一、引言随着计算机科学技术发展和相关理论的不断完善,数字图像处理技术被广泛应用于可视电话、电视会议、监控系统、商用及工业生产领域中.在技术要求中,一个突出的问题就是数据量庞大、数据处理相关性高、实现实时比较困难。
而实时性的主要因素为图像处理的速度,即要求数字图像处理系统要有强大的运算能力.高性能DSP 的发展为实时的图像处理提供了一个解决方法。
高速DSP 不仅可以满足在运算性能方面的需要,而且由于DSP 的可编程性,还可以在硬件一级获得系统设计的极大灵活性。
TI公司的TMS320DM642是一款专门面向多媒体应用的专用DSP。
该DSP时钟高达600 MHz,8个并行运算单元,处理能力达4800MIPS;采用二级缓存结构,具有64位外接存储器接口,兼容JTAG边界扫描,为了面向多媒体应用,还集成了3个可配置的视频端口.采用DM642为核心设计的数字图像处理系统,能够很好的满足图像处理要求。
二、系统硬件平台框架系统的整体硬件框图如图1所示,整个系统是以TMS320DM642为核心构成的应用系统.包括DM642处理器芯片、视频编解码器芯片、其他外围电路。
DM642通过I2C总线对视频编解码器进行配置,使其能够满足系统的需求;通过VP口接收和传送视频数据以及同步控制信号;通过EMIF总线实现外部存储器的扩展,SDRAM 用于运行时的程序代码和数据的存储,FLASH用于系统引导程序的存储。
DSP 数字图像处理实验

数字图像处理实验一、实验目的1.了解数字图像处理的基本原理;2.学习灰度图像反色处理技术;3.学习灰度图像二值化处理技术;4.掌握数字图像处理在DSP上的实现。
二、实验设备计算机,CCS 2.0版软件,DSP仿真器,实验箱。
三、实验要求要求实现灰度图像的读入、反色处理和二值化处理,并将原灰度图像、反色处理后和二值化处理后的图像显示出来。
四、实验步骤和内容1.实验准备(1)DSP仿真器与计算机连接好;(2)将DSP仿真器的JTAG插头与SEED-DEC5502单元的J1相连接;(3)打开SEED-DTK5502的电源。
观察SEED-DTK_MBoard单元的+5V,+3.3V,+15V,-15V的电源指示灯以及SEED-DEC5502的电源指示灯D2、D4是否均亮;若有不亮的,请断开电源,检查电源。
(4)复习数字图像处理的基本原理,重点学习灰度图像反色处理和二值化处理相关的理论知识;(5)在计算机E盘,建立“Tu”子目录,将“Lena64.bmp”文件拷入;2.具体实验步骤(1)打开CCS软件,进入CCS的主界面;(2)按照在CCS环境下进行DSP程序开发的一般过程和实验要求编写程序;首先在E盘建立一个自己的工作目录,然后运行Project/New命令,新建一个工程文件(扩展名为.pjt);接着运行File/New/Source File命令新建扩展名为.c的主程序和扩展名为.cmd的链接命令文件;将C的运行支持库文件rts55x.lib(位于C:\ti\c5500\cgtools\lib目录下)复制到E盘自己建立的工作目录下;(3)运行Project /Add Files to Project命令,将扩展名为.c的主程序、扩展名为.cmd的链接命令文件和C的运行支持库文件rts55x.lib添加到工程文件当中去;在工程管理窗口中,双击Source文件夹下的C语言源文件,可以在右边窗口中看到该文件的具体内容,如下图3-4所示;然后可以继续编辑、修改源程序,以便满足实验要求。
基于DSP的数字图像处理

论文题目: 基于DSP的数字图像处理专业:学号:姓名:老师:成绩:目录摘要●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●● 2 1基于DSP的图像处理●●●●●●●●●●●●●●●●●●●●●2 1.1图像处理的基本概念●●●●●●●●●●●●●●●●●●● 2 1.2图像处理的研究背景●●●●●●●●●●●●●●●●●●● 2 2基于DSP的图像处理原理简介●●●●●●●●●●●●●●●● 3 3图像处理各领域应用●●●●●●●●●●● ● ●●●●●●●●●3 4数字图像处理技术主要问题●●●●●●●●● ●●●●●●●● 4 5图像处理研究内容● ●●●●●●●●●●●●● ●●●●●●●● 4 6 TMS320C6000 DSP芯片●●●●●●●●●●●●● ●●●●●●● 5 6.1 DSP芯片的特点●●●●●●●●●●●●●●●●●●●●● 5 6.2基于DSP的图像处理系统●●●●●●●●●●●●●●●● 6 6.3图像处理的硬件系统● ●●●●●●●●●●●●●● ●●●●● 76.3.1 TMS320C6000 DSP芯片的硬件系统●●●●● ●●●●● 76.3.2 TMS320C6000的硬件结构简介●●●●●●● ●●●●● 76.3.3 TMS320C6000系列CPU结构●●●●●●●● ●●●●● 7 6.4算术单元●●●●●●●●●●●●●●●●●●●●● ●●●●● 8 6.5总线结构●●●●●●●●●●●●●●●●●●●●● ●●●●● 8 6.6专用寻址单元● ●●●●●●●●●●●●●●●●●●●●●●● 9 6.7流水处理●●●●●●●●●●●●●●●●●●●●●●●●●● 9 6.8大容量片内存储器●●●●●●●●●●●●●●●●●●●●● 10 6.9零消耗循环控制●●● ●●●●●●●●●●●●●●●●●●● 10 7基于DSP的图像处理实现●●●●●●●●●●●●●●●●●● 107.1图像处理分类● ●●●●●●●●●●●●●●●●●●●●●● 107.2图像直方图统计● ●●●●●●●●●●●●●●●●●●● 10 8基于DSP数字图像具体实例(实际结果见附录)● ●●●●● 118.1图像反色●●●●●●●●●●●●●●●●●●●●●●●● 118.2图像二值化自适应阀值法●● ●●●●●●●●●●●●●● 11 9论文总结● ●●●●●●●●●●●●●●●●●●●●●●●●●● 12 10参考文献● ●●●●●●●●●●●●●●●●●●●●●●●●● 13 11附录(DSP数字图像处理实验结果)●●●●●●●●●●●● 1411.1图像反色实验●●●●●●●●●●●●●●●●●●●●● 1411.2用固定值128作为阀值●● ●●●●●●●●●●●●●● 1411.3用图像的灰度均值作为阀值●●●●●●●●●●●●●● 1511.4用自适应阀值法找出最佳阀值●●●●●●●●●●●●● 15摘要:随着计算机、多媒体和数据通信技术的高速发展,数字图像技术近年来得到了极大的重视和长足的发展,并在科学研究、工业生产、医疗卫生、教育、娱乐、管理和通信等方面取得了广泛的应用。
DSP图像处理算法的实现

答辩人:黄德天 学号:04140021 系别:电子工程系 指导教师:杨涛教授
主要研究工作
• 基于标准C,设计通用的基本图像处理算 法,并在此基础上,考虑最通用的DSP结构 的优化要求来细化C语言的程序结构,优化 程序的实现方法。本设计完成了图像处理 中,卷积、相关和中值滤波运算的算法实 现;基于TI公司的TMS320C6000硬件平 台的结构特点,本设计采用的算法优化方法 包括:使用编译器选项、内联函数和字访问 短型数据、软件流水和循环展开等。
• 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优化方法-内联函数
软件流水是用来安排循环指令,使循环的多次迭代 同时执行的一种技术。图3是一个循环代码的软件 流水示意图。图中A,B,C,D和E表示特别迭 代,其后的数字表示各次迭代的第几条指令,同一 行中的指令是同一周期内并行执行的指令。 返回
• 3×3相关运算处理后图像:
• 程序中要求输出图像为32位,但是在本次设计 中,图像都是用8位来显示的,因此实验结果只是 黑白图像。
数字图像处理在DSP上的实现(缩小)

课程设计任务书成绩评定表摘要以TMS32C5501为例,介绍了其系列DSP(digital signal processing)芯片HPI(host port interface)口的各个组成部分及其功能,并以AT89C51单片机作为主处理机,阐述了与TMS320C5501之间实现数据共享的方法,成功地解决了主处理机通过HPI接口对DSP 内部数据进行在线修改和实时监控的问题。
最后给出了如何用HPI口实现程序的加载引导,以提高程序运行速度的方法。
关键词:TMS320C5501,DSP,HPI口;目录绪论....................................................................................... 错误!未定义书签。
1、基本原理 (2)1.1 数字图像处理常用方法 (2)1.2 数字图像处理的优点 (3)1.3 数字图像缩小基本原理 (4)2、TMS320C5X的硬件结构 (4)2.1 C55X的CPU体系结构 (5)2.2 指令缓冲单元(I) (5)2.3 指令缓冲单元(P) (5)2.4 指令缓冲单元(A) (6)2.5 指令缓冲单元(D) (6)3、数字图像缩小设计方法 (8)3.1 设计思路 (8)3.2 实验步骤 (8)4、数字图像缩小的CCS实现 (10)4.1 简述CCS环境 (10)4.1.1 CCS主要特点 (10)4.1.1 DSP/BIOS和API函数以及RTDX插件 (9)4.2 CCS配置 (10)4.3 CCS环境中工程文件的使用 (10)4.3.1 建立工程文件 (10)4.3.2 创建新文件 (13)4.3.3 向工程项目中添加文件 (13)4.4编译链接和运行目标文件 (14)4.4.1对程序进行编译链接 (14)4.4.2装载OUT文件 (14)5运行结果 (14)结论 (15)附录程序清单 (23)参考文献 (24)1、课题分析DSP作为一种先进的可编程处理器,近几年来应用极其广泛。
DSP课设数字图像处理——二值化

DSP技术及应用课程设计报告课题名称:数字图像处理——二值化学院:电气信息工程学院专业:通信工程班级:姓名:学号:指导教师:董胜成绩:日期:2014.6.9-2014.6.20目录一、设计目的及要求 (2)二、设计所需的软件介绍 (2)三、设计原理 (3)四、程序流程图 (6)五、设计程序 (7)六、处理后的效果展示 (11)七、课程设计心得 (15)八、参考文献 (16)一、设计目的及要求:目的:1、掌握CCStudio3.3的安装和配置;2、掌握数字图像处理的原理、基本算法和各种图像处理技术;3、掌握图像的灰度化、二值化和灰度直方图的原理及编程思路;4、掌握图像滤波(图像锐化、中值滤波、边缘检测、特征识别等)的基本原理及编程方法及编程思路;要求:1、能够根据设计题目要求查阅检索有关的文献资料,结合题目选学有关参考书。
查询相关资料,初步制定设计方案。
2、用CCS软件进行C语言设计相关算法,实现对图像的采集及处理。
3、编写相应的C语言程序实现各种图像处理。
二、设计所需的软件介绍:英文全称:Code Composer Studio 中文译名:代码调试器,代码设计套件。
CCS的全称是Code Composer Studio,它是美国德州仪器公司(Texas Instrument,TI)出品的代码开发和调试套件。
TI公司的产品线中有一大块业务是数字信号处理器(DSP)和微处理器(MCU),CCS便是供用户开发和调试DSP和MCU程序的集成开发软件。
Code Composer Studio v3.3 (CCStudio v3.3) 是用于 TI DSP、微处理器和应用处理器的集成开发环境。
Code Composer Studio 包含一整套用于开发和调试嵌入式应用的工具。
它包含适用于每个 TI 器件系列的编译器、源码编辑器、项目构建环境、调试器、描述器、仿真器以及多种其它功能。
Code Composer Studio IDE 提供了单个用户界面,可帮助您完成应用开发流程的每个步骤。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字图像处理在DSP上的实现(旋转)1 绪论1.1设计目的图像旋转是一种应用广泛的数字图像处理技术,随着应用水平的不断提高,对在嵌入式系统中实现高分辨率大图像旋转的需求也越来越高。
如在航空领域的高分辨率数字地图图像的显示处理过程中,由于现有的显示芯片均不能支持图像旋转功能,就需要在资源有限的嵌入式平台上实现大幅面地图图像的实时旋转。
采用DSP平台是一种实现方式,具体实现时需仔细考虑两个方面的问题,一是选用计算量小的旋转算法,二是充分发挥DSP平台强大的并行计算能力。
1.2设计任务1.能从计算机上读取图片。
2.编写图像旋转程序,在TMS320C5509上实现。
2 设计原理及分析2.1设计原理目前,已经有很多有效降低计算量的图像旋转算法,基于图像线性存储结构的旋转方法就是其中之一。
然而,在DSP平台上,有限的高速存储资源限制了这些算法效率的直接发挥,需要针对算法及DSP平台的性能结构特点进行高效的数据调度。
对于图像旋转问题而言,数据调度还需要克服由于存在大量非连续图像像素地址访问而严重影响DSP数据存取及CPU效率发挥的问题。
这是图像旋转本身的特殊性,在其他图像处理技术中是不存在的。
由DSP的结构特点可知,只有在数据和程序均位于片存储器当中的条件下,DSP 的效率才能得到最大化的发挥。
在大图像旋转算法中,由于涉及的图像数据量远大于DSP的片存储器容量,源图像和最终视口图像等数据必须被存放在片外存储器中。
在这种情况下,为了保证DSP CPU高速处理能力的发挥,必须优化数据流,将源图像分块,依次搬移至片处理,并设法保证CPU当前要处理的图像数据块已经事先在片存储器中准备好了。
因此在算法整体优化结构上采用Ping-Pong双缓冲技术,利用EDMA与CPU并行工作来隐藏图像数据块在片和片外之间的传输时间,使CPU能连续不断地处理数据,中间不会出现空闲等待。
传统的图像旋转一般通过矩阵乘法实现:其中,α为旋转角度。
由于图像是线性存储的,各个像素点之间的相对位置关系确定。
如图1(a)所示,图像旋转前,任意像素点P(x,y)和P1(x1,y1)、P2(x2,y2)及A(xA,yA)在几何上是矩形的四顶点关系。
由于旋转变换是线性变换,如图1(b)所示,图像旋转后,各个像素点之间的相对位置关系不发生变化,旋转算法的数据调度目的是使算法能够按照一定的规则,将源图像数据有规律地分块,并按次序分别传输到DSP片存储器中,完成计算后,形成视口图像块,再将视口图像块按同样的顺序进行排列,形成旋转后的视口图像。
整个过程要求调入和调出的图像数据均是规则分块的,并且调入的源图像块中应该包含计算视口图像块的过程中所需要的全部像素数据,尤其需要解决其中的大量非连续图像像素地址访问问题。
视口逆时针旋转的情况与此类似。
区别有以下两点:①源图像块的左边框中点与相应的视口图像块旋转后的左上角顶点对应;②源图像块的顶点局部坐标地址值与视口图像块的顶点局部坐标地址值之间的对应关系式应为:其中height指源图像块的高度。
3 软件程序3.1主程序#include<stdlib.h>#include<stdio.h>#include<graphics.h>#include<alloc.h>#include<ctype.h>int load_cut(char *fname);int load_convolution_matrix(char *fname);int convolve_image(void);int swap_pictures(void);int minx,maxx,miny,maxy;int LOADPAGE=0;int ENHANCEPAGE=1;int *cmat, *pmat, *vmat;int cmx,cmy,cmnum;struct palettetype palette,newpal; int driver,mode;int cleancut=-1;int init_graphics(void){driver=DETECT; mode=0; detectgraph(&driver,&mode);if(driver==VGA) mode=VGAMED; initgraph(&driver,&mode,""); getpalette(&palette); getpalette(&newpal);}int cleanup_image(void){int i,j,num,x,y,k;if(cleancut<0) return; setactivepage(LOADPAGE); setvisualpage(ENHANCEPAGE); for(x=minx;x<maxx;x++) {for(y=miny;y<maxy;y++) {if(getpixel(x,y)!=0) num=-1;else num=0;for(j=-1;j<2;j++) {for(i=-1;i<2;i++) {if(getpixel(x+i,y+j)!=0) num++;}}if(num>cleancut) {k=getpixel(x,y);setactivepage(ENHANCEPAGE);putpixel(x,y,k);setactivepage(LOADPAGE);}}}k=ENHANCEPAGE; ENHANCEPAGE=LOADPAGE; LOADPAGE=k;}void show_test_image(void){int i;minx=cmx; miny=cmy;maxx=100+minx; maxy=100+miny;setcolor(1);moveto(minx,miny);randomize();for(i=0;i<20;i++)lineto(random(100)+minx,random(100)+miny);for(i=0;i<10;i++)fillellipse(random(50)+25+minx,random(50)+25+miny,random(25),random(25));}main(){char fname[50];int flag=0;load_convolution_matrix("matrix.dat");printf(".CUT file (1) or test image (0)?");scanf("%d",&flag);flag= flag? 1:0;if(flag) {fflush(stdin);printf("filename to process:");gets(fname);}printf("Delete pixels with x or fewer neighbors. x="); scanf("%d",&cleancut);if(cleancut>8) cleancut=8;init_graphics();setactivepage(1); cleardevice();setactivepage(0); cleardevice();setactivepage(LOADPAGE); setvisualpage(LOADPAGE); if(flag) load_cut(fname);else show_test_image();cleanup_image();setvisualpage(ENHANCEPAGE);convolve_image();swap_pictures();restorecrtmode();}int toggle_colors(char c){c=tolower(c);c=c-'a';if(c<0 || c>=palette.size) return 0;newpal.colors[c]= palette.colors[c]-newpal.colors[c]; setpalette(c,newpal.colors[c]);return 1;}int swap_pictures(void){int mode=0;char a;setvisualpage(LOADPAGE);for(;;) {a=getch();if(a==27) return;if(toggle_colors(a)) continue;if(mode==0) setvisualpage(ENHANCEPAGE);if(mode==1) setvisualpage(LOADPAGE);mode=1-mode;}}int convolve_image(void){int i,j,k,nval;int *vx, *vy, *c;int colmax,offset,end,midy;char **lines=NULL;char *temp=NULL;offset=-minx+(cmx/2);end=cmy-1; midy=cmy/2;lines=(char **)malloc(cmy*sizeof(char *));for(i=0;i<cmy;i++) lines[i]=(char *)malloc(sizeof(char)*(maxx-minx+cmx+1));setactivepage(LOADPAGE);for(j=-cmy/2;j<cmy/2;j++) {for(i=minx-cmx/2;i<(maxx+cmx/2+1);i++) {lines[j+midy][i+offset]=getpixel(i,j+miny);}}colmax=getmaxcolor();for(j=miny;j<maxy;j++) {setactivepage(LOADPAGE);for(i=j+cmy/2,k=minx-cmx/2,nval=maxx+cmx/2;k<nval;k++) lines[end][k+offset]=getpixel(k,i);for(i=minx;i<maxx;i++) {/* Load & multiply neighbors into matrix */ setactivepage(LOADPAGE);vx=vmat; vy=vmat+1; c=cmat; nval=0;for(k=0;k<cmnum;k++) {if(*c) nval+= lines[(*vy)+midy][i+(*vx)+offset]*(*c);/* if(*c) nval+= getpixel(i+(*vx),j+(*vy)) * (*c); */c++;vx+=2; vy+=2;}/* Cut off values too high or too low */if(nval<0) nval=0;if(nval>colmax) nval=colmax;/* Place new pixel value */setactivepage(ENHANCEPAGE);putpixel(i,j,nval);}if(kbhit()) { getch(); break; }/* rotate line pointers */temp=lines[0];for(i=1;i<cmy;i++) lines[i-1]=lines[i];lines[end]=temp;}for(i=0;i<cmy;i++) {if(lines[i]!=NULL) free(lines[i]);}if(lines!=NULL) {free(lines);}return;}int build_offset_vectors(void){int *t;int il,im,jl,jm,i,j;il=-cmx/2; im=cmx+il;jl=-cmy/2; jm=cmy+jl;t=vmat;for(j=jl;j<jm;j++) {for(i=il;i<im;i++) {*t++=i; *t++=j;}}}int load_convolution_matrix(char *fname) {/* Layout of matrix file:#x #yx0y0 x1y0 ... xny1.... .... ... ....x0ym x1ym ... xnym*/FILE *mf;int *t;int i,j,im,jm;if( (mf=fopen(fname,"rt"))==NULL ) {printf("Cannot load matrix file.\n");abort();}fscanf(mf,"%d%d",&im,&jm);if( (im&1)==0 || (jm&1)==0 ) {printf("Convolution matrix MUST have a center point.\n"); abort();}if( (cmat=(int *)calloc(im*jm,sizeof(int)))==NULL ) {printf("Unable to calloc convolution matrix.\n");abort();}if( (vmat=(int *)calloc(2*im*jm,sizeof(int)))==NULL ) { printf("Unable to calloc offset vector matrix.\n");abort();}cmx=im; cmy=jm; cmnum=im*jm;t=cmat;for(j=0;j<jm;j++) {for(i=0;i<im;i++) {if( fscanf(mf,"%d",t++)!=1 ) {printf("Unable to read matrix.\n");abort();}}}fclose(mf);build_offset_vectors();}int load_cut(char *fname){static unsigned char st[3000];char *sp=st,*spend;int stp=0;int width,height;FILE *fp;int x,y,xl,yl;int i,n,len,d,j;fp=fopen(fname,"rb");width=getw(fp); height=getw(fp);xl=cmx; yl=cmy;minx=xl; miny=yl;maxx=xl+width; maxy=yl+height;if(maxy>(getmaxy()-cmy)) {maxy=getmaxy()-cmy;height=maxy-yl;}getw(fp);y=yl-1;for(sp=st,n=0;n<height;n++) {stp=getw(fp);for(sp=st,spend=st+stp;sp<spend;) *sp++=getc(fp); sp=st; spend=sp+stp; x=xl; y++;while(sp<spend) {if(*((unsigned char *)sp)>0x80) {len=(*sp++) & 0x7f;if(!(*sp)) { x+=len; continue; }setcolor(*sp++);moveto(x,y);linerel(len,0);x+=len;continue;} else {len=*sp++;for(j=0;j<len;j++) putpixel(x++,y,*sp++);continue;}}}fclose(fp);}3.2初始化和读取图像程序#include<stdio.h>#define MODEPHOTO1 1#define MODEPHOTO2 2#define GRAYBARLEVEL 16void ReadImage(unsigned char*pImage,char*cFileName,int nWidth,int nHeight);void InitImage(unsigned int nMode,unsigned char*pImage,int nWidth,int nHeight){swich(nMode){case MODEPHOTO1:Readimage(pImage,"..\\DSP.bmp",nWidth,nHeight);break;case MODEPHOTO2:ReadImage(pImage,"..\\1.bmp",nWidth,nHeight);break;default:break;}}void ReadImage(unsigned char*cFileName,int nWidth,int nHeight) {int j;unsigned char*pWork;FILE*fp;if(fp=fopen(cFileName,"rb")){fseek(fp,1078L,SEEK_SET);pWork=pImage+(nHeight-1)*nWidth;for(j=0;j<nHeight;j++,pWork-=nWidth)fread(pWork,nWidth,1,fp);fclose(fp);}}4 运行结果分析从实验结果可以看出,调整图像旋转,由于存在对称性,一幅图像任意角度的旋转可分解为一次90°或180°或270°的旋转,再加上一次±45°以的旋转。