Posts Tagged ‘图像处理 程序 多线程’
多线程提高图像处理效率
图像处理的运算量往往比较大的, 大多数滤镜效果的处理都需要对图像中的每一个像素进行运算才能得到最后的就效果。 如果使用单线程的方法进行处理,将大大降低处理效率。 现在流行的图像处理软件均采用分块,多线程的处理方式对图像进行处理, 多线程可以充分利用cpu时间,很大程度上提高处理效率, 尤其现今的酷睿等多核处理器的普及使得多线程程序的效力得以很好的发挥。
这里简单讨论一下实现的思路。根据实际研究,发现Photoshop在处理图像时,会先将图片进行块状划分,划分块的大小一定的, 划分的块数则根据图像的大小而有不同。在划分了块后,则启动若干个线程对图像划分块进行独立运算。因为图像运算大多数是针对单个像素的运算, 这一特性使得多线程处理能够满足需要。在编写基于多线程的图像处理程序时,我们不能简单的使用windows提供的Bitmap结构, 因为该结构过于简单,非常不利于程序的运算,要想提高程序运行效率往往需要实现自己的图像包装类,也就是说,无论图像以何种文件结构存在,在读入内存是都将被转换为自己的格式,比如定义图像类FBImage
从FBImage类的申明可以看出, 无论原始图像的颜色灰度是多少,我们都采用32位深度的格式存储,这样做的目的是大大降低运算开销(当然对于某些索引颜色格式的文件进行颜色转换的应用来讲是例外)。 假如我们吧图像的运算块定义为 256 x 256,那么在处理在处理512 x 512 的图像时把图像分为4块,然后启动4个独立的线程对每个像素进行计算,最后得到新的结果。
在此,必须先了解一下图像运算的本质, 假设有像素 P , 经过算子 C 计算得出新的像素 Q , 那么该过程应该用以下方式表达:
Q = C(P)
根据此公式, 可以写出相应的算子类
其中 Color代表像素P的 颜色值, src表示源像素,dst表示结果像素。 这样才能很好的配合多线程进行计算,以达到提高效率的目的。