图像处理中使用多线程及图像分块实现加速运算1.实验背景很多图像处理算法,编写完毕、调试正确后,就是漫长的算法优化。有些算法处理效果很棒,但是运算非常的耗时,还是无法集成产品给用户。本文介绍的基于多线程和图像分块实现加速运算,因为调用了opencv库,比较容易编写和实现。OpenCV全称是是OpenSourceComputerVisionLibrary,它是由Intel微处理器研究实验室的视觉交互组开发,是一种用于数字图像处理和计算机视觉的开源函数库,采用的开发语言是C++。2.实验目的对于一副图像,比如8000*5333分辨率,我们在处理时,通常思路是从第1个像素开始,一直计算到最后一个像素。其实,目前不论手机还是个人电脑,处理器都是多核。那么完全可以将整副图像分成若干块,比如cpu为4核处理器,那么可以分成4块,每块图像大小为2000*5333,这样程序可以创建4个线程,每个处理器执行一个线程,每个线程处理一个图像块。虽然这样操作后,运算速度不会显著提升4倍,因为线程创建、释放、上下文切换都要耗些时间。但运算速度还是将明显提升,一般4核vs1核,运算时间将降低一半。3.代码分析3.1转黑白图像3.2计算线程3.3输出结果3.4分块计算3.5等待分块计算完成3.6主函数4.实验效果转换前图片:转换后图片:5.实验结果使用不同的线程数(图片分块)来测试并行效果,实验的线程数为:1、2、3、4、5、6、7、8。其实,线程数为1时为串行程序。每个规模在同一线程数量上进行十次实验,最后取其平均值作为最后运行时间。主要通过计算每次实验的加速比来分析并行性能。定义加速比:加速比=串行程序运行时间/并行程序运行时间。运行时间是计算这个问题线程所用的真实时间。实验结果数据统计:运行时间、加速比数据统计:单位/ms12345678910均值加速比1线程801735735741750739734750746738746.912线程438419406444422422435438406423425.31.7563线程328328312313328312326328312315320.22.3334线程282266265297281265265265296266274.82.7175线程240247244244238241249240244249243.63.0666线程215221216215221212213213226217216.93.4437线程280281281281281312297279282290286.42.6078线程266296284273265276291266282266276.52.7016.结果分析由以上数据统计可以看出,加速比都会随着矩阵规模的增大而提升(耗时会下降),即在问题规模不变时,在线程数越多,加速比会增大(耗时会减少)。从表中可以看到,并行程序加速比都会大于1,并且随着线程数的增多,加速比不断增大。并行计算确实可以提高程序的运行效率,但是这个运行效率的提高并不是线性的提高的。也就是我们不可能获得线性加速比,因为多个线程/线程总是会引入一些代价。分布式内存程序通常需要跨物理传输数据,这比访问局部内存中的数据慢。相反,串行程序没有这些额外的开销。因此,想要达到一个具有线性加速比的并行程序是很难的。此外,随着线程个数的增多,通信开销也会增大,这就意味着需要更大的通信开销,因此这也是并行计算不能获得线性加速比的原因。如上表所示,线程7和线程8虽然加速比仍然大于1,但是与上一个线程相比加速比还是已经下降。