基于相关系数影像匹配实习报告

合集下载

影像匹配实习报告

影像匹配实习报告

一、实习背景随着科技的不断发展,医学影像学已成为现代医学的重要组成部分。

影像匹配技术作为医学影像学的一个重要分支,在临床诊断、疾病治疗及科研等方面发挥着越来越重要的作用。

为了更好地掌握影像匹配技术,提升自己的专业素养,我于近期参加了影像匹配实习。

二、实习目的1. 熟悉影像匹配技术的基本原理和操作流程;2. 掌握常见疾病的影像匹配方法及诊断技巧;3. 提高自己的临床思维能力和实际操作能力;4. 为今后从事医学影像学相关领域的工作打下坚实基础。

三、实习内容1. 影像匹配基本原理及操作流程(1)影像匹配基本原理影像匹配技术是将不同时间、不同设备或不同部位获取的医学影像进行对比分析,以揭示疾病发生、发展及转归规律的一种技术。

其主要原理包括图像处理、特征提取、相似度计算等。

(2)影像匹配操作流程1)图像预处理:对原始影像进行滤波、去噪、增强等处理,提高图像质量;2)特征提取:从预处理后的图像中提取具有代表性的特征,如纹理、形状、结构等;3)相似度计算:采用合适的相似度度量方法,对提取的特征进行相似度计算;4)结果分析:根据相似度结果,对疾病发生、发展及转归进行诊断。

2. 常见疾病的影像匹配方法及诊断技巧(1)肺部疾病1)肺结节:通过影像匹配技术,观察结节大小、形态、密度等特征,结合病史、临床表现,判断良恶性;2)肺炎:分析影像特征,如病灶范围、形态、密度等,结合病史、临床表现,判断病原体及类型。

(2)心血管疾病1)冠状动脉粥样硬化:通过影像匹配技术,观察冠状动脉狭窄程度、斑块特征等,评估病变程度;2)心肌梗死:分析影像特征,如心肌缺血范围、坏死程度等,判断心肌梗死类型及预后。

3. 实际操作能力提升在实习过程中,我跟随导师参与多项影像匹配项目,实际操作经验不断积累。

通过实际操作,我掌握了以下技能:(1)熟练使用影像匹配软件,如ITK、OpenCV等;(2)熟悉各种图像处理方法,如滤波、去噪、增强等;(3)掌握特征提取方法,如纹理、形状、结构等;(4)具备一定的编程能力,能够独立完成影像匹配项目。

影像处理实习报告

影像处理实习报告

一、实习背景随着科技的飞速发展,医学影像处理技术在临床诊断和治疗中的应用越来越广泛。

为了更好地掌握影像处理技术,提高自己的专业技能,我在某三甲医院影像科进行了为期一个月的实习。

本次实习旨在了解影像处理的基本原理、操作流程以及在实际临床中的应用。

二、实习内容1. 影像处理基本原理(1)影像数据采集:实习期间,我了解了影像数据采集的基本原理,包括X射线、CT、MRI、超声等不同成像技术的数据采集方法。

(2)影像数据传输:影像数据采集后,需要通过传输设备将数据传输到影像处理工作站。

实习期间,我学习了网络传输、存储设备等方面的知识。

(3)影像处理算法:影像处理主要包括图像增强、分割、配准、融合等算法。

实习期间,我了解了这些算法的基本原理和应用场景。

2. 影像处理操作流程(1)图像预处理:实习期间,我学习了图像预处理的基本步骤,包括滤波、锐化、对比度增强等。

(2)图像分割:图像分割是将图像分割成若干个具有相同特征的区域。

实习期间,我学习了阈值分割、区域生长、边缘检测等方法。

(3)图像配准:图像配准是将不同时间或不同模态的图像进行对齐。

实习期间,我了解了基于特征点、基于模板匹配等配准方法。

(4)图像融合:图像融合是将不同模态的图像进行合成,以获得更丰富的信息。

实习期间,我学习了基于像素级、基于特征级、基于深度学习的融合方法。

3. 影像处理在实际临床中的应用(1)肿瘤诊断:实习期间,我参与了肿瘤影像诊断工作,学习了如何通过影像处理技术提高肿瘤的检出率和诊断准确性。

(2)心血管疾病诊断:实习期间,我了解了心脏CT、心脏MRI等影像数据在心血管疾病诊断中的应用,学习了如何利用影像处理技术提高诊断水平。

(3)神经系统疾病诊断:实习期间,我参与了神经系统疾病的影像诊断工作,学习了如何利用影像处理技术辅助诊断脑肿瘤、脑出血等疾病。

三、实习收获1. 提高了影像处理理论知识:通过本次实习,我对影像处理的基本原理、操作流程有了更深入的了解,为今后的工作打下了坚实的基础。

影像匹配实习报告

影像匹配实习报告

实习报告一、实习背景及目的随着科技的发展,计算机视觉领域取得了显著的成果,影像匹配技术在众多领域发挥着重要作用,如无人驾驶、无人机监测、图像搜索等。

为了更好地了解影像匹配技术及其应用,提高自己的实际操作能力,我参加了为期一个月的影像匹配实习。

本次实习的主要目的是学习影像匹配的基本原理,掌握相关算法,并实际操作影像匹配项目,从而提升自己在计算机视觉领域的专业素养。

二、实习内容与过程1. 实习前的准备在实习开始前,我首先对影像匹配技术的基本概念和相关算法进行了学习,包括特征提取、特征匹配、投影变换等。

此外,我还复习了Python编程和OpenCV库的使用,为实习打下了坚实的基础。

2. 实习内容实习期间,我主要进行了以下几个方面的学习与实践:(1) 特征提取:学习并实现了SIFT、SURF、ORB等特征提取算法,了解了它们的特点及适用场景。

(2) 特征匹配:掌握了FLANN、Brute-Force、KNN等特征匹配算法,并通过实验对比了它们的性能。

(3) 投影变换:学习了单应性矩阵和基础矩阵的概念,实现了RANSAC算法进行投影变换的估计。

(4) 实践项目:以无人机监测为例,实现了一个简单的影像匹配应用,包括图像预处理、特征提取、特征匹配、投影变换和结果展示等环节。

3. 实习中的困难与解决方法在实习过程中,我遇到了一些困难,如特征匹配算法在实际应用中的性能不稳定、投影变换估计时的误判问题等。

针对这些困难,我通过查阅资料、与同学和导师交流,不断尝试优化算法参数,提高了实习项目的准确性。

三、实习收获与反思通过本次实习,我对影像匹配技术有了更深入的了解,掌握了相关算法和实际操作方法。

同时,实习过程中遇到的困难也锻炼了我的解决问题和团队合作的能力。

然而,我也意识到自己在某些方面的不足,如对算法的理解不够深入、实际操作经验不足等。

在今后的工作中,我将继续努力学习,提高自己的专业素养,为将来的工作打下坚实的基础。

关于医学影像的实习报告范文(精选3篇)

关于医学影像的实习报告范文(精选3篇)

关于医学影像的实习报告范文(精选3篇)关于医学影像的实习报告范文(精选3篇)难忘的实习生活已经告一段落了,这次实习让你心中有什么感想呢?这时候就十分有必须要写一份实习报告了!在写之前,可以先参考范文喔!以下是小编精心整理的关于医学影像的实习报告范文(精选3篇),欢迎阅读与收藏。

医学影像的实习报告1 一、情况介绍医学影像学是将现代放射学、微电子学、电子计算机、图像处理等最新科技成果用于诊断、治疗疾病的一门新兴学科。

现代医学成像技术飞速发展,无论是普通 x 线、核素、超声照旧 x 线计算机体层摄影、磁共振成像等技术,影像的密度分辨率与空间分辨率大大提高,使各种影像相互配合、相互增补、相互印证,可以更清晰地展示人体的器官结构,结合病史、身子骨儿检查、化验等临床资料,进行综合分析,较着地提高了临床诊治水平。

目前学生已经通过了两年的基础医学、临床医学、医学影像学等系统的理论学习,进入到最后一年的理论和实践相结合的阶段——毕业实习阶段。

在 32 周的毕业实习中,使学生对医学影像学各方面的基本理论知识、基本操作及常见并高发病的诊断能较全面较系统地掌握,更好地完成实习使命,为他们此后的工作打下坚实的基矗。

二、实习目标通过毕业实习,明确做为医学院影像专业医疗事务工笔者的责任,树立良好的医德医风,掌握医学影像专业必备的基础理论、基本知识和基本技能,具有一定的自学和运用知识分析问题、解决问题的能力,毕业后能在地区级及以下医院卫生机构从事医学院影像技术及诊断工作。

具体要求是: (一)影像技术 1.熟悉各种检查方法,正确引导病人就医。

2.独立完成暗室技术与管理的各项工作。

3.能熟练地掌握 x 线机的操作方法并进行常规检查部位的普通 x 线摄影及造影,拍摄出符合诊断要求的 x 线片。

4.熟悉 x 线特殊检查技术,包孕高仟伏摄影、软 x 线摄影、数字 x 线检查及超声检查。

5.知道 ct 、 mri 、介入放射检查的操作规程要领及基本步骤。

影像实践实训报告(2篇)

影像实践实训报告(2篇)

第1篇一、实训背景随着科技的飞速发展,影像技术已经广泛应用于各个领域,如医疗、影视、广告等。

为了提高自己的专业技能,增强实际操作能力,我参加了本次影像实践实训。

本次实训旨在通过实际操作,掌握影像设备的操作方法,了解影像制作流程,提高影像制作水平。

二、实训目的1. 熟悉各类影像设备的操作方法,如摄像机、灯光、录音设备等。

2. 掌握影像拍摄的基本技巧,提高影像质量。

3. 了解影像制作流程,提高影像制作效率。

4. 培养团队合作精神,提高沟通协调能力。

三、实训内容1. 影像设备操作(1)摄像机操作:学习摄像机的基本操作,如开机、关机、拍摄、回放等。

(2)灯光操作:了解灯光的种类、用途,学习灯光布局、调整光线等。

(3)录音设备操作:学习录音设备的操作方法,如录音、回放、降噪等。

2. 影像拍摄技巧(1)构图:学习画面构图的基本原则,如三分法、对称法等。

(2)光线:掌握光线运用技巧,如逆光、侧光、顺光等。

(3)运动:了解摄像机运动的基本方式,如推拉、摇移、跟拍等。

3. 影像制作流程(1)前期策划:明确拍摄主题、对象、场景等。

(2)拍摄:根据前期策划进行拍摄,注意画面质量、光线、构图等。

(3)后期制作:对拍摄素材进行剪辑、调色、特效等处理。

四、实训过程1. 第一阶段:理论学习通过阅读教材、观看教学视频,了解影像设备操作、拍摄技巧、制作流程等相关知识。

2. 第二阶段:实践操作在指导下,进行实际操作练习,如摄像机操作、灯光调整、录音设备使用等。

3. 第三阶段:团队协作分组进行影像制作,从前期策划、拍摄到后期制作,培养团队合作精神。

4. 第四阶段:作品展示与评价将制作完成的影像作品进行展示,互相评价,总结经验。

五、实训成果1. 掌握了摄像机、灯光、录音设备等影像设备的操作方法。

2. 提高了影像拍摄技巧,制作的影像作品质量有所提高。

3. 了解了影像制作流程,提高了制作效率。

4. 培养了团队合作精神,提高了沟通协调能力。

影像的实习报告4篇

影像的实习报告4篇

影像的实习报告4篇影像的实习报告篇1在完成临床实习的任务之后,接下来进入了我的专业——医学影像学的实习阶段,我立志成为一名优秀的超声波诊断医师,实习将我向这个目标迈进了一步,虽然还有一段很长的距离,但只要努力加用心我相信这个距离会一步一步地缩小的。

进入实习后才发现,超声波远没有想象中的容易,在学校里学的理论知识主要是诊断,然而临床上所见的并非都是标准的声像图表现,不同的患者即时是正常结构形态也是各有千秋,开始的时候真的很困难,图像很多不认识,我的带教老师要求我先认识正常图像,正常图像认清之后,再记异常声像图表现,只有这样看到了异常图像才能准确的诊断出来,这就需要长期大量的接触病患,多看、多记,才能提高自己的诊断水平。

超声波还有一个关键就是手法,深入的手法必须靠在临床上的实践才能不断进步,手法的重要性在于有时即使你能诊断,若手法不到位打不到关键的理想的切面,病变未能清晰显示,诊断就无从谈起了,这就在于超声波的实时显像的特点,尤其是心脏超声波,婴幼儿的导管未闭,常常是很细微的,需要轻微的转动探头,仔细观察,手法稍一不到位,就会导致漏诊。

手法确实是一个艰难的学习过程,手力、臂力,都要用的.,特别遇到脂肪层较厚的患者,有时需要双手加压才能获得比较理想的图像,不然根本诊断不了,刚开始操作时只压个几分钟,手就开始使不上劲发起抖来,我想我也许应该像针灸推拿医师一样,练手力、指力等等的肢体力量练习,我以后一定加强手法练习。

超声波科主任赵老师说过:“手法这个东西要活,不能硬搬书本,比如说观察胎儿唇部,书上肯能会说,先找到胎儿的颏下,往上打唇部,其实当你颏下不好打而眼睛鼻子好打的时候可以选择往下找打唇部,反而更容易一些。

”由此看出手法需要一定的领悟能力,多做,不断总结,才能提高手法技能。

刚开始实习确实心比较急,理论在实践的过程中,因为差距而不断遇到障碍,但是只要坚持,这样一段过程总会成为过去,渐渐的熟悉明了:看到肾盂积液下一步开始找结石; 胆囊内的高回声,让患者翻身,动则为结石,不移动则为息肉; 看到肝脏的声像图出现声晕征即为肝占位性病变,看到肠管明显扩张考虑肠梗阻等理论和实践渐渐联系起来了,我也逐渐进步了。

影像实习报告范文

影像实习报告范文

影像实习报告范文影像学实习报告一、实习目的本次影像学实习的主要目的是通过实践操作,加深对影像学理论知识的理解,掌握影像学检查的基本技能,培养临床思维和实际操作能力。

二、实习内容1. 影像学基础理论学习- 影像学原理- 影像学设备操作流程- 不同类型影像检查的适应症和禁忌症2. 影像学设备操作实践- X光机、CT、MRI等设备的使用- 影像学检查的标准化流程3. 影像学诊断能力培养- 影像学图像的解读- 常见疾病的影像学表现4. 临床实践- 跟随医生进行临床诊断- 参与病例讨论三、实习过程1. 理论学习在实习的初期,我通过阅读教材、参加讲座和研讨会,对影像学的基础理论有了更深入的理解。

我学习了X光、CT、MRI等影像学检查的原理和操作流程。

2. 设备操作在导师的指导下,我逐步熟悉了各种影像学设备的操作方法。

我学会了如何调整设备参数,确保检查的准确性和安全性。

3. 诊断能力培养通过观察和分析大量的影像学图像,我学会了识别和解读各种疾病的影像学特征。

我参与了多次病例讨论,提高了自己的临床诊断能力。

4. 临床实践在实习的后期,我跟随资深医生参与了临床诊断。

我观察了医生如何根据影像学检查结果,结合患者的临床症状,做出准确的诊断。

四、实习心得通过这次实习,我不仅掌握了影像学检查的基本技能,还提高了自己的临床思维能力。

我深刻体会到,影像学检查是诊断疾病的重要手段,但也需要结合患者的具体情况进行综合分析。

五、实习总结1. 掌握了影像学检查的基本操作流程和设备使用方法。

2. 学会了如何解读影像学图像,识别常见疾病的影像学特征。

3. 培养了临床思维能力,提高了临床诊断的准确性。

4. 认识到影像学检查在临床诊断中的重要性,以及与其他医学领域的交叉应用。

六、建议与展望1. 建议加强影像学与临床实践的结合,提高实习生的实际操作能力。

2. 展望未来,影像学技术将不断发展,为疾病的诊断和治疗提供更多可能。

通过本次实习,我对影像学有了更全面的认识,也为自己的医学生涯打下了坚实的基础。

基于相关系数法分区影像匹配的研究

基于相关系数法分区影像匹配的研究


1 m·n
(
mn
∑∑g
i = 1j = 1
i,j )
(
mn
∑∑g'
i = 1j = 1
i
+
r,j +
c
)
槡[ ] [ ] m n i∑= 1j∑= 1g2i,j

1 m·n
(
mn
∑∑g
i = 1j = 1
i,j )
2
mn
i∑= 1j∑= 1g'2i + r,j + c

1 m·n
(
mn
∑∑g'
i = 1j = 1
右影像灰度函数为 g'( x,y) ,搜索窗口中心像素为( i +
r,j + c) ,则两窗口间相关系数的值为:
mn
ρ( c,r) =
∑∑(
i = 1j = 1
gi,j
- 珔g) (
g'i + r,j + c
- 珔g')
mn
mn
槡∑∑( i = 1j = 1
gi,j
- 珔g) 2·∑∑( i = 1j = 1
1前言
影像匹配实质上是在两幅或多幅影像上识别同名 点的过程,同名点的确定是以匹配测度为基础的。目 前,影像匹配的算法主要分为基于灰度的匹配和基于 特征的匹配。相关系数法是一种基于灰度的匹配[1], 它还可 作 为 其 他 匹 配 如 最 小 二 乘 法 等 算 法 的 初 匹 配[2]。这种方法基于统计理论,对像点进行灰度检测, 并利用一定的算法进行相似性度量,即计算相关系数。 当相关系数最大时,就认为是同名像点。采用核线影 像作为数据源时,这种方法计算量更小,简单易行,且 其匹配精度可达到一个像素。但是,相关系数法影像 匹配常采用整体影像匹配方式,匹配精度容易受到两 幅( 或多幅) 影像灰度及纹理不一致的影响,笔者在试 验的基础上,采用分区影像匹配的方式,提高了相关系 数法影像匹配的精度。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于相关系数影像匹配实习报告一、实习内容与目的通过上机编程实现基于相关系数算法的影像匹配,从而更加熟练的掌握书本上关于影像匹配及相关系数算法的理论知识,并熟悉上机编程的操作。

二、实习原理影像匹配实质上是在两幅或是多幅影像之间识别同名点,其中基于相关系数的算法是实现影像匹配的基本算法之一。

相关系数是标准化的协方差函数,协方差函数除以两信号的方差即得相关系数。

计算相关系数的公式如下:g(x,y)与g ’(x ’,y ’)的相关系数为:),(),(),(q p C C q p C q p g g gg ''=ρ其中:⎰⎰∈-=Dy x gg dxdy y x g E y x g C ),(2)]},([),({ ⎰⎰∈''++'-++'=Dy x g g dxdy q y p x g E q y p x g q p C ),(2)]},([),({),( 若(p0, q0)>(p, q),(p ≠p0,q ≠q0),则p0,q0为搜索区影像相对于目标区影像的位移参数。

由离散灰度数据对相关系数的估计为∑∑∑∑∑∑====++==++⋅'-'⋅-'-'-=m i njm i njc rcj r i j i m i njc j r i j i g g g g g g g g r c 11112,,2,11,,)()())((),(ρ∑∑==++'⋅='m i njcj r i rc g nm g 11,,1,∑∑==⋅=m i njj i g nm g 11,1考虑到计算工作量,相关系数的实用公式为∑∑∑∑∑∑∑∑∑∑∑∑∑∑======++++======++==++'⋅-'⋅-'⋅-⋅=m i nj m i n j m i nj c j r ic j r i m i n j j i ji m i njm i n j c j r im i n j j i c j r i j i g n m g g n m gg g n m g g r c 1111211,,2211,,21111,11,,,])(1][)(1[)()(1)(),(ρ三、实习步骤及相关代码在第一次点特征点实习的基础上我们组进行了第二次基于相关系数的影像匹配实习。

所以程序实现的部分操作直接利用前次实习的中的程序。

(1)读入左右影像 FILE* pSrcFileLeft = NULL;pSrcFileLeft = fopen(srcFileLeft,"rb");if(pSrcFileLeft == NULL){printf("原始左片影像打开失败\n");return FAILURE;}FILE* pSrcFileRight = NULL;pSrcFileRight = fopen(srcFileRight,"rb");if(pSrcFileRight == NULL){printf("原始右片影像打开失败\n");return FAILURE;}(2)确定目标窗口大小通过老师课堂上的讲授和我们在编程过程中的不断尝试,我们默认使用的窗口的尺寸为11*11。

(3)确定目标点的位置由前次的实习中得到左相片中的特征点作为这次实习的目标点。

(4)预测右影像搜索范围本程序中也在左相片中计算出了特征点,然后将左右两相片中的特征点进行计算相关系数。

(5)逐窗口计算相关系数并保存相应的储存单元将左相片中的目标点与右相片中的特征点进行相关系数的计算。

(6)比较相关系数,取最大相关系数作为匹配点对于分别比较上一步骤中计算出的相关系数,选取出最大的一个相关系数作为匹配点。

程序操作如下:在程序主界面中点击Extend中选取ImageMatch选项,然后进入参数设置界面。

设置读取和保存影像路径和窗口大小等参数后,点击Progress进行运算。

四、实习结果及分析作为数据源的左右影像如些图所示:左相片右相片经过计算后得到的目标点左右图像分别如下所示:左相片右相片显示匹配点号:通过老师得到的图片可以看出在左相片中得到的五个目标点中有四个在右相片中找到了同名点,由此可以看出本程序基本满足实习要求,并得到理想的结果。

不足的地方就是选取的特征点的数量不够多,这样就无法判断本程序的“误判”的情况如何。

五、实习体会在学习到相关系数的时候,一看到计算相关系数的公式的时候我就有种被折服的感觉,那个公式实在是太复杂,它使我感觉我怎么也不能记住这个复杂的公式。

不过经过这次实习后,我觉得这个公式又不是当初认为的那样无法记忆。

我想这次实习我最大的收获就是对于之前在学习过程中遇到不懂知识以及难以记忆的知识都得到了加强,方便了我对他们的理解与记忆。

其次,在编程过程中更加锻炼自己动手编程的能力,使得我编程能力较之前有着一定的提高。

每次编程实习都是一个积累经验的过程,然后通过一次次的实习后,我最终的能力就能够得到很好的体现。

附件:void Moravec(BYTE* pSrcBits, vector<FEATUREPOINT> *FeaturePoint,int m_threshold, int m_window1, int m_window2, int width, int height, int* Count1){。

此部分程序与点特征程序中代码一样,因此不再重复粘贴}vector<FEATUREPOINT> RemoveReplicative(vector<FEATUREPOINT> v){vector<FEATUREPOINT> ret;vector<FEATUREPOINT>::iterator iter = v.begin();ret.clear();ret.push_back(*iter);vector<FEATUREPOINT>::iterator iter2;BOOL b(FALSE);for (iter = v.begin(); iter != v.end(); ++iter){b = false;for (iter2 = ret.begin(); iter2 != ret.end(); ++iter2){if (iter->x == iter2->x && iter->y == iter2->y){b = TRUE; //存在break;}}if (b == FALSE){ret.push_back(*iter);}}return ret;}void SaveBand(int width, int height, int byteCount, int biBitCount, LPBYTE pBits, CString SavePath){BITMAPFILEHEADER bmfh;BITMAPINFOHEADER bmih;bmfh.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"bmfh.bfReserved1 = 0;bmfh.bfReserved2 = 0;if (biBitCount == 8){bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256*4;bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256*4 + byteCount;}else if (biBitCount == 24){bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + byteCount;}else{MessageBox(NULL, "8bit or 24bit accepted", "错误", MB_ICONERROR);return;}bmih.biBitCount = biBitCount;bmih.biWidth = width;bmih.biHeight = height;bmih.biSize = 40;bmih.biPlanes = 1;bmih.biCompression = BI_RGB;bmih.biSizeImage = bmfh.bfSize;bmih.biClrImportant = 0;bmih.biClrUsed = 0;bmih.biXPelsPerMeter = 0;bmih.biYPelsPerMeter = 0;CFile f;//保存位图if (f.Open(SavePath, CFile::modeCreate | CFile::modeWrite)){f.Write(&bmfh, sizeof(bmfh));f.Write(&bmih, sizeof(bmih));if (biBitCount == 8){RGBQUAD rgb[256];int i(0);for (; i < 256; ++i){rgb[i].rgbBlue = i;rgb[i].rgbGreen = i;rgb[i].rgbRed = i;rgb[i].rgbReserved = 0;}//修改颜色表255对应的颜色rgb[255].rgbBlue = 0;rgb[255].rgbGreen = 0;rgb[255].rgbRed = 255;f.Write(rgb, sizeof(RGBQUAD)*256);}f.Write(pBits, byteCount);f.Close();}else{MessageBox(NULL, "保存图像失败", "错误", MB_ICONERROR);return;}}void DrawCross(BYTE* pBits, vector<FEATUREPOINT> FeaturePoint, int _width, int byteCount){vector<FEATUREPOINT>::iterator iter;int i(0), j(0);for (i = 0; i < byteCount; ++i){if (pBits[i] == 255)pBits[i] = 254;}for (iter = FeaturePoint.begin(); iter != FeaturePoint.end(); ++iter){i = iter->y;j = iter->x;pBits[i*_width+j] = 255;pBits[i*_width+j+1] = 255;pBits[i*_width+j-1] = 255;pBits[(i+1)*_width+j] = 255;pBits[(i-1)*_width+j] = 255;pBits[i*_width+j+2] = 255;pBits[i*_width+j-2] = 255;pBits[(i+2)*_width+j] = 255;pBits[(i-2)*_width+j] = 255;}}void DrawCross(BYTE* pBits1, BYTE* pBits2, vector<MATCHEDPOINTS> MatchedPoints, int _width1, int _width2, int byteCount1, int byteCount2){vector<MATCHEDPOINTS>::iterator iter;int i(0), j(0);for (i = 0; i < byteCount1; ++i){if (pBits1[i] == 255)pBits1[i] = 254;}for (j = 0; j < byteCount2; ++j){if (pBits2[j] == 255)pBits2[j] = 254;}for (iter = MatchedPoints.begin(); iter != MatchedPoints.end(); ++iter){i = iter->y1;j = iter->x1;pBits1[i*_width1+j] = 255;pBits1[i*_width1+j+1] = 255;pBits1[i*_width1+j-1] = 255;pBits1[(i+1)*_width1+j] = 255;pBits1[(i-1)*_width1+j] = 255;pBits1[i*_width1+j+2] = 255;pBits1[i*_width1+j-2] = 255;pBits1[(i+2)*_width1+j] = 255;pBits1[(i-2)*_width1+j] = 255;i = iter->y2;j = iter->x2;pBits2[i*_width2+j] = 255; //pBits2[i*_width2+j+1] = 255;pBits2[i*_width2+j-1] = 255;pBits2[(i+1)*_width2+j] = 255;pBits2[(i-1)*_width2+j] = 255;pBits2[i*_width2+j+2] = 255;pBits2[i*_width2+j-2] = 255;pBits2[(i+2)*_width2+j] = 255;pBits2[(i-2)*_width2+j] = 255;}}void SaveList(vector<FEATUREPOINT> FeaturePoint, CString txtFile)FILE* pTxtFile= fopen(txtFile, "wt");if (!pTxtFile)return;fprintf(pTxtFile, "#\t特征点数: %d\n\n", FeaturePoint.size());fprintf(pTxtFile, "坐标X\t坐标Y\t兴趣值\n");vector<FEATUREPOINT>::iterator iter;for (iter = FeaturePoint.begin(); iter != FeaturePoint.end(); ++iter)fprintf(pTxtFile, "%d\t%d\t%d\n", iter->x, iter->y, (int)iter->IV);fclose(pTxtFile);}void SaveList(vector<MATCHEDPOINTS> MatchedPoints, CString txtFile){FILE* pTxtFile= fopen(txtFile, "wt");if (!pTxtFile)return;fprintf(pTxtFile, "#同名点对数: %d\n\n",MatchedPoints.size());vector<MATCHEDPOINTS>::iterator iter;for (iter = MatchedPoints.begin(); iter != MatchedPoints.end(); ++iter)fprintf(pTxtFile, "%d\t%d\t%d\t%d\t%f\n",iter->x1, iter->y1, iter->x2, iter->y2, iter->coefficient);fclose(pTxtFile);}int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){if (argc != 15){::MessageBox(NULL,"启动参数不正确,请从GUI.exe或命令行参数启动","",MB_ICONASTERISK);return FAILURE;}system("Mode con: COLS=50 LINES=150");system("title Image_Match");int nRetCode = 0;if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)){cerr << _T("Fatal Error: MFC initialization failed") << endl;nRetCode = 1;return nRetCode;}CString srcFileLeft, srcFileRight, dstFileLeft, dstFileRight, txtFile;CString threshold_Left,window1_Left,window2_Left;CString threshold_Right,window1_Right,window2_Right;CString CoRelated,window3,flag1; //启动参数srcFileLeft = argv[1];srcFileRight = argv[2];dstFileLeft = argv[3];dstFileRight = argv[4];txtFile = argv[5];threshold_Left = argv[6]; //阈值window1_Left = argv[7];window2_Left = argv[8];threshold_Right = argv[9];window1_Right = argv[10];window2_Right = argv[11];CoRelated = argv[12];window3 = argv[13];flag1 = argv[14]; //判断是否在创建结果文件后显示int m_threshold_L = atoi(threshold_Left);int m_window1_L = atoi(window1_Left);int m_window2_L = atoi(window2_Left);int m_threshold_R = atoi(threshold_Right);int m_window1_R = atoi(window1_Right);int m_window2_R = atoi(window2_Right);double m_CoRelated = (double)atoi(CoRelated) / 100;int m_window3 = atoi(window3);int m_flag1 = atoi(flag1);if (GetFileAttributes(srcFileLeft) == -1){CString err;err.Format("文件:%s不存在", srcFileLeft);::MessageBox(NULL,err, "Error", MB_ICONERROR);return FAILURE;}if (GetFileAttributes(srcFileRight) == -1){CString err;err.Format("文件:%s不存在", srcFileRight);::MessageBox(NULL,err, "Error", MB_ICONERROR);return FAILURE;}//打开2幅影像FILE* pSrcFileLeft = NULL;pSrcFileLeft = fopen(srcFileLeft,"rb");if(pSrcFileLeft == NULL){printf("原始左片影像打开失败\n");return FAILURE;}FILE* pSrcFileRight = NULL;pSrcFileRight = fopen(srcFileRight,"rb");if(pSrcFileRight == NULL){printf("原始右片影像打开失败\n");return FAILURE;}//读取左片数据BITMAPFILEHEADER bmfhLeft;BITMAPINFOHEADER bmihLeft;fread(&bmfhLeft, sizeof(BITMAPFILEHEADER), 1, pSrcFileLeft);fread(&bmihLeft, sizeof(BITMAPINFOHEADER), 1, pSrcFileLeft);if(bmihLeft.biBitCount != 8){printf("只支持8位位图: 左片\n");return FAILURE;}DWORD widthLeft = bmihLeft.biWidth;DWORD heightLeft = bmihLeft.biHeight;DWORD _widthLeft = (widthLeft*8 + 31)/32*4; //saved widthLeft in files DWORD pixelCountLeft = _widthLeft*heightLeft;fseek(pSrcFileLeft, 256*sizeof(RGBQUAD), SEEK_CUR);BYTE* pSrcBitsLeft = new BYTE[pixelCountLeft]; //new 1fread(pSrcBitsLeft, sizeof(BYTE), pixelCountLeft, pSrcFileLeft);fclose(pSrcFileLeft);pSrcFileLeft = NULL;//读取右片数据BITMAPFILEHEADER bmfhRight;BITMAPINFOHEADER bmihRight;fread(&bmfhRight, sizeof(BITMAPFILEHEADER), 1, pSrcFileRight);fread(&bmihRight, sizeof(BITMAPINFOHEADER), 1, pSrcFileRight);if(bmihRight.biBitCount != 8){printf("只支持8位位图: 右片\n");return FAILURE;}DWORD widthRight = bmihRight.biWidth;DWORD heightRight = bmihRight.biHeight;DWORD _widthRight = (widthRight*8 + 31)/32*4; //saved widthRight in files DWORD pixelCountRight = _widthRight*heightRight;fseek(pSrcFileRight, 256*sizeof(RGBQUAD), SEEK_CUR);BYTE* pSrcBitsRight = new BYTE[pixelCountRight]; //new 2fread(pSrcBitsRight, sizeof(BYTE), pixelCountRight, pSrcFileRight);fclose(pSrcFileRight);pSrcFileRight = NULL;//开始计算左片特征点//计算左片的兴趣点存储于该vector中vector<FEATUREPOINT> FeaturePointLeft;vector<FEATUREPOINT> FeaturePointRight;int Count1(0);int Count2(0);Moravec(pSrcBitsLeft, &FeaturePointLeft, m_threshold_L, m_window1_L, m_window2_L, widthLeft, heightLeft, &Count1);Moravec(pSrcBitsRight, &FeaturePointRight, m_threshold_R, m_window1_R, m_window2_R,widthRight, heightRight, &Count2);cout << FeaturePointLeft.size() << endl;cout << FeaturePointRight.size() << endl;FeaturePointLeft = RemoveReplicative(FeaturePointLeft);FeaturePointRight = RemoveReplicative(FeaturePointRight);cout << "FeaturePointLeft.size() == " << FeaturePointLeft.size() << endl;cout << "FeaturePointRight.size() == " << FeaturePointRight.size() << endl;SaveList(FeaturePointLeft, "d:\\list1.txt");SaveList(FeaturePointRight, "d:\\list2.txt");//特征点计算完毕,存储于vector中//遍历vector, 在右片中搜寻相关系数最大的窗口vector<FEATUREPOINT>::iterator iter1;vector<FEATUREPOINT>::iterator iter2;int k = m_window3 / 2;int i(0), j(0), m(0), n(0);BYTE* pTemplate = new BYTE[m_window3*m_window3]; //new 5ZeroMemory(pTemplate, sizeof(BYTE)*m_window3*m_window3);BYTE* pTarget = new BYTE[m_window3*m_window3]; //new 6ZeroMemory(pTarget, sizeof(BYTE)*m_window3*m_window3);vector<MATCHEDPOINTS> MatchedPoints;float MaxR(0);float R(0);double A(0), B(0), C(0), D(0), E(0); //计算相关系数的中间量int lMaxWidth;int lMaxHeight;int Count3(0), Count4(0);for (iter1 = FeaturePointLeft.begin(); iter1 != FeaturePointLeft.end(); ++iter1){cout << endl << "Left point ID: " << Count2++ << endl;//计算该点对应的特征点B = 0.0;D = 0.0;MaxR = 0.0;R = 0.0;if (iter1->x < k || iter1->y < k || iter1->x > heightLeft - k || iter1->y > widthLeft - k) {cout << "Left point abort: " << Count3++ << endl;continue;}//逐个搜索//将左片小窗口内的数据拷贝//可先求出B,Dfor (i = 0; i < m_window3; ++i){for(j = 0; j < m_window3 ; ++j){//B = 小窗口所有像素灰度值求和//D = ....................的平方再求和B += pSrcBitsLeft[(i+iter1->y)*_widthLeft + (j+iter1->x)];D += pSrcBitsLeft[(i+iter1->y)*_widthLeft + (j+iter1->x)] *pSrcBitsLeft[(i+iter1->y)*_widthLeft + (j+iter1->x)];}}Count4 = 0;//逐个小窗口计算Rfor (iter2 = FeaturePointRight.begin(); iter2 != FeaturePointRight.end(); ++iter2) {if (iter2->x < k || iter2->y < k || iter2->x > heightRight - k || iter2->y > widthRight - k) {cout << "Right point abort: " << Count4++ << endl;continue;} A = 0.0;C = 0.0;E = 0.0;j = iter2->x; //i,j为中心点i = iter2->y;j -= k; //i,j为顶点i -= k;int centerX = j + k;int centerY = i + k;//这里的centerX,centerY就是右片某个小窗口的中心//求A,C,Efor (m = 0; m < m_window3; ++m){for(n = 0; n < m_window3 ; ++n){//C = 左片小窗口所有像素灰度值求和//E = ........................平方的求和//A = 对应位置像素灰度直乘积之和C += pSrcBitsRight[(i+m)*_widthRight + (j+n)];E += pSrcBitsRight[(i+m)*_widthRight+(j+n)]*pSrcBitsRight[(i+m)*_widthRight+(j+n)];A += pSrcBitsRight[(i+m)*_widthRight+(j+n)] *pSrcBitsLeft[(m+iter1->y)*_widthLeft + (n+iter1->x)];}}double temp1 = D - B*B/m_window3/m_window3;double temp2 = E - C*C/m_window3/m_window3;if (temp1 != 0 && temp2 != 0){R = (A - B*C/m_window3/m_window3) / sqrt(temp1*temp2);}elseR = 0;if (R > MaxR){MaxR = R;lMaxWidth = centerX;lMaxHeight = centerY;cout << R << endl;}}if (MaxR >= m_CoRelated){MATCHEDPOINTS mp;mp.coefficient = MaxR;mp.x1 = iter1->x;mp.y1 = iter1->y;mp.x2 = lMaxWidth;mp.y2 = lMaxHeight;MatchedPoints.push_back(mp);}}//保存结果位图DrawCross(pSrcBitsLeft, pSrcBitsRight, MatchedPoints,_widthLeft, _widthRight, pixelCountLeft, pixelCountRight);SaveBand(widthLeft, heightLeft, _widthLeft*heightLeft, 8, pSrcBitsLeft, dstFileLeft);SaveBand(widthRight, heightRight, _widthRight*heightRight, 8, pSrcBitsRight, dstFileRight);//保存特征点列表SaveList(MatchedPoints, txtFile);//clean updelete[] pSrcBitsLeft;delete[] pSrcBitsRight;delete[] pTemplate;pSrcBitsLeft = NULL;pSrcBitsRight = NULL;pTemplate = NULL;if (m_flag1 == 1){ShellExecute(NULL, "open", txtFile, NULL, NULL, SW_SHOWNORMAL);}return nRetCode;}。

相关文档
最新文档