在c++中加速图像过滤
Speed up image filter in C++
我用c++写了一个图像过滤器。它取256行32bpp位图中的每个像素(将像素存储在一行接一行的连续数组中),在5x5区域内对相邻像素执行操作,并产生4个输出像素,使图像的分辨率达到原始图像的2倍。这些都在CPU上完成。
过滤器没有像我想的那么快。我需要它持续运行在16毫秒以下。我是否可以使用多线程来加速它,或者开销是否不一致,并且可能总共花费超过16毫秒的时间?还有其他方法可以加快速度吗?
如果多线程可以加速,那么实现越具体越好。任何代码示例将非常感激!
听起来你的问题是"琐碎的并行",所以多线程绝对可以帮助接近线性的改进。这是一个经典的数据细分问题。您可以将图像细分为N个区域(N = #您想要的线程)。每个区域将需要类似于(尺寸/N+4)像素的图像(每个区域将有一些重叠的像素,"鬼细胞",以适应您正在应用的5x5内核)。然后,所有线程写入公共"输出"区域的特定区域。由于线程的输出区域不重叠,因此不需要任何互斥锁或锁。
例如,如果你有一个256x256的图像,你使用4个线程:
- 每个线程获得(256/4 + 4)= 68像素的条带。它们有自己独特的64像素区域,每边有2个额外的像素。它们在中心的64像素区域进行计算(外部像素仅用于5x5卷积内核)
- 或者,每个线程获得一个132x132块(每边128x128 + 4),并做相同的。
这是一种经典的MPI细分技术,但在许多其他库中也很容易实现。
手头的任务显然是高度可并行的-这意味着多线程将有助于。一般的思路是:
- 为目标图像分配(连续)内存,考虑适当的间距/填充(如果需要)
- 计算你有多少cpu可用
- 将图像区域拆分为
n
区域-行,列或矩形区域 - 生成
n
并行工作线程,每个线程拾取一块工作 - 如果你为这些线程设置亲和性掩码,这样它们每次活动时都在同一个核心上执行,这肯定会有帮助
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 平均图像时图像损坏
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- C++ 图像过滤算法
- 幼稚的过滤返回错误的图像
- 图像过滤不正确
- 放大的PPM图像(无过滤)
- OPENCV-直接用指针访问过滤图像,并用内核矩阵过滤
- 提高平均图像过滤速度的方法
- 过滤 1bpp 图像
- 如何过滤图像中给定宽度的线条
- 如何在OpenCV中过滤具有邻域主色的图像
- 初学者对图像过滤的尝试
- 在c++中加速图像过滤
- 为什么我过滤后的图像(应该是二进制的)仍然包含彩色部分?(C++中的OpenCV)
- 创建拉普拉斯矩阵,过滤图像
- c++, opencv:在过滤操作中对源和目标图像使用相同的Mat是否安全?