0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于图像处理的多线程计算介绍

Dbwd_Imgtec 来源:未知 作者:李倩 2018-04-03 11:41 次阅读

图像处理的算法复杂度通常都比较高,计算也相应比较耗时。利用CPU多线程处理能力可以大幅度加快计算速度。但是,为了保证多线程处理的结果和单线程处理的结果完全相同,图像的多线程计算有一些需要特别考虑的地方。

基本思路:

为了能让多个线程同时并行处理,那么各自处理的数据不能有交集,这很好理解。那么基本思路是将一副图像分成多个子块,每个子块数据肯定是没有交集的,每个线程对一个子块数据进行处理,完成后将所有子块处理结果合成最终图像。

首先,每个子块的大小当然是必须考虑的问题。通常当应用进行一个较长时间的操作,应该用合适的方式告知用户。既然我们把图像分子块处理,如果单个子块处理时间很短,那么每当有一个子块的数据处理完成,我们就可以立即把它相应的处理结果展示给用户。用户就会看到这个图像各个部分的处理结果不断展示出来,直至整个图像完成。这样某种程度上用这种方式就是在告知用户正在处理进行中,避免为了把整个图像处理完成,用户需要等待太长时间。从这个角度来说,如果子块尺寸取的太大,每个子块计算时间肯定相应地加长,对于快速显示部分处理结果给用户是不利的。但是如果子块太小,子块总数就会增加,肯定会增加线程开销和其他一些开销(分割图像,分配子块数据等等),对于总的计算时间是不利的。这是一个权衡问题,可以根据具体情况确定。

另外,很多图像处理都要考虑像素领域范围的信息,因此对于每个子块的处理不能仅仅使用这个子块的内容。具体地,对于靠近子块边缘的像素,还要把子块外的部分像素信息考虑进来,加入计算,才能保证相应像素的处理结果是正确的。准确来说,如果领域半径为r(对方形或圆形领域来说,其他领域可做相应调整),那么子块处理所需要的所有数据是子块四周向外扩展r像素的范围。

代码中extend就是子块要向四周扩张的大小,其实就是领域半径r。pRect[i]是分割的第i个子块的大小。Height和Width是原图的高宽,扩展子块自然不能超过原图的尺寸。那么最后rect1就是计算所需要的数据在原图中所在的领域范围,应用原图的尺寸对它进行了限制。由于我是把每个子块当成一个新的图像进行处理,rect2就是新图像中子块处理结果所在的位置,用它来合成最终图像。

最后关于线程具体创建销毁,资源分配与回收,线程同步和通信,不做具体讨论。只讨论一下在这里多线程如何协调工作的问题。由于计算子块的线程只负责处理子块,还需要有人来做分割子块,分配数据给子块计算线程等等工作。本来应该画流程图的,实在懒得画了,这里简单描述一下几个线程如何协调工作的,其实也很简单。界面线程A,处理和用户之间的交互,接受用户命令,发送计算消息给线程B。计算协调线程B接受A的消息,分割子块,分配子块数据,创建子块计算线程Ci。子块计算线程Ci负责子块计算,发送处理结果(成功或失败)消息给线程B或者A。界面线程A收到子块完成消息,可以立即显示子块处理结果,当然也可以什么都不做,等到所有子块处理完再显示。协调线程B收到第i个子块完成消息,回收分配给线程Ci的资源,销毁Ci。如果所有的Ci完成了工作,B发送图像处理完成的消息给A,A可以接着做后续的工作。这里单独用了一个线程B来做子块计算协调的工作,感觉这样比较清晰一些。当然也可以让界面线程A来做这个工作,协调的工作量也不是很大,这样就可以不需要B线程。

单线程和多线程处理时间对比

多线程处理速度肯定不能简单地是单线程处理速度的N倍,这只是理想状况。由于很多额外工作(线程开销,准备每个线程的数据,处理结果的合成,线程间同步,图像子块结合部的部分重复计算),多线程是不可能达到理想状况的。下表列出了一副2400x1350大小的24bit图像分成了12个子块,分别在一台I5 4300U(双核四线程)笔记本上和一台I5 6500(四核四线程)台式机上,处理高斯模糊的大概的平均耗时。高斯模糊算法是简单的行列方向两次一维计算,半径取50。在我的测试中,还实时显示了分块的处理结果,速度上可能要更慢一点。

理想状况下四线程耗时最多能减少75%,实际上肯定达不到。在双核四线程平台上,对亮度通道处理,多线程比单线程耗时减少了一半(50%)。对RGB通道,多线程比单线程耗时减少了大概59%。在四核四线程平台上,多线程耗时在亮度通道和RGB通道处理时,分别减少了64%和69%。可以看到,多线程处理的加速效果还是相当明显的。话说牙膏厂超线程的效果还是挺惊人的,不然在双核CPU上耗时减少是不可能超过50%的。当然物理内核的数量就更重要了。

而且还可以看到一个现象,在单线程处理下,RGB三通道的处理耗时是亮度通道处理耗时3倍略少,约为2.8倍(亮度通道还包括一些在RGB和亮度之间转换的额外计算量)。而在多线程下,RGB三通道的处理时间大大小于亮度一个通道处理时间的3倍,约为2.38倍。相对于单线程,节省的时间更多了。这是因为RGB的处理也是在子块的一个线程中处理的,并没有增加新的线程开销。因此线程开销也是必须考虑的一个因素,不可忽略。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像处理
    +关注

    关注

    26

    文章

    1224

    浏览量

    55823
  • 多线程
    +关注

    关注

    0

    文章

    271

    浏览量

    19724

原文标题:图像处理的多线程计算

文章出处:【微信号:Imgtec,微信公众号:Imagination Tech】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Java多线程的用法

    本文将介绍一下Java多线程的用法。 基础介绍 什么是多线程 指的是在一个进程中同时运行多个线程,每个线
    的头像 发表于 09-30 17:07 618次阅读

    基于MIPS多线程处理器的SOC设计

    多线程是一种基于硬件或软件的处理技术,它的主要目标是利用计算工作负载的并发性来提高性能。多线程也可以用来区别各种任务,以便将优先权分配给如语音、视频或关键数据等对时间更加敏感的流量。
    发表于 07-18 06:24

    介绍Arduino借助多线程SCoop库如何轻松实现并发处理任务

    我们在用Arduino开发复杂项目时,或多或少会面临多任务同时处理的工作场景,本篇简单介绍Arduino借助多线程SCoop库如何轻松实现并发处理任务。
    发表于 08-24 06:57

    在LabVIEW中为何要关闭多线程

    在LabVIEW中为何要关闭多线程在LabVIEW中,为何要关闭多线程?解答: 关于关闭多线程存在两个原因:正在使用旧的或者较慢的电脑所用vi程序莫名其妙的崩溃对于一台旧电脑有限的资源
    发表于 05-08 21:10

    利用多线程思想实现单片机系统的伪并行处理

    介绍和分析了一种原用于计算机高级语言的编程思想---多线程编程,向单片机控制系统的移植。利用多线程的编程思想进行单片机的复杂控制,可以应用到一些对系统控制有苛刻
    发表于 08-07 09:09 40次下载

    利用MIPS多线程处理器优化SoC设计

     多线程是一种基于硬件或软件的处理技术,它的首要目标是计算型工作中利用并发来提高性能。多线程也可以用于区别各种任务,以便可以将优先权分配给更多时间敏感的流量,如语音、视频或关键数据。而
    发表于 01-20 06:55 2321次阅读
    利用MIPS<b class='flag-5'>多线程</b><b class='flag-5'>处理</b>器优化SoC设计

    同时多线程处理器的指令调度器设计

    同时多线程处理器的指令调度器设计_李乐
    发表于 01-08 14:55 0次下载

    Linux下多线程的视频图像平滑度评价算法_饶鸿

    Linux下多线程的视频图像平滑度评价算法_饶鸿
    发表于 03-19 11:27 0次下载

    关于多线程编程教程及经典应用案例的汇总分析

    在一个程序中,这些独立运行的程序片段叫作线程,利用它编程的概念就叫作多线程处理。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一
    发表于 10-16 16:46 0次下载

    多线程细节问题学习笔记

    这一次我们要说下关于final在多线程的作用,原子性的使用,死锁以及Java中的应对方案,线程的局部变量 和 读写锁的介绍关于final
    发表于 11-28 15:34 1008次阅读
    <b class='flag-5'>多线程</b>细节问题学习笔记

    关于python不能真正多线程问题解析

    多线程,是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体
    发表于 12-01 10:36 2319次阅读
    <b class='flag-5'>关于</b>python不能真正<b class='flag-5'>多线程</b>问题解析

    多线程好还是单线程好?单线程多线程的区别 优缺点分析

    摘要:如今单线程多线程已经得到普遍运用,那么到底多线程好还是单线程好呢?单线程多线程的区别又
    发表于 12-08 09:33 8w次阅读

    基于DM6646开发板的多线程编程在嵌入式图像处理中的应用

    基于DM6646开发板的多线程编程在嵌入式图像处理中的应用(嵌入式开发北京)-文档为基于DM6646开发板的多线程编程在嵌入式图像
    发表于 08-04 15:29 10次下载
    基于DM6646开发板的<b class='flag-5'>多线程</b>编程在嵌入式<b class='flag-5'>图像</b><b class='flag-5'>处理</b>中的应用

    基于QT自制上位机(多线程

    前言:应用程序在某些情况下需要处理比较复杂的逻辑,例如常规的图传上位机,如果在传输图片跑到较高码流或对图像执行一些处理任务是,引用多线程可以明显 改善响应度和反馈速度。 QT
    发表于 05-09 11:47 1次下载
    基于QT自制上位机(<b class='flag-5'>多线程</b>)

    关于Python多进程和多线程详解

    进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度
    的头像 发表于 11-06 14:46 306次阅读
    <b class='flag-5'>关于</b>Python多进程和<b class='flag-5'>多线程</b>详解