Python和C++中使用并行计算增强图像处理能力

2024-10-23 08:30   重庆  

点击下方卡片,关注“机器视觉与AI深度学习

视觉/图像重干货,第一时间送达!

    你是否曾经发现自己要等待很长时间才能处理一个装满图片的文件夹?无论是将它们转换为灰度图还是执行其他图像处理任务,如果您在单个线程中处理所有内容,处理大型数据集可能会非常慢。幸运的是,并行计算可以解决这个问题!

    本文中我们将介绍如何使用并行计算来加速常见的计算机视觉任务:将图像转换为灰度图。我们将研究两个示例:一个使用Joblib库在Python中编写,另一个使用 OpenMP 在 C++中编写。

    Joblib简介:

    OpenMP简介:
🚀 为什么要进行并行计算?
    并行计算就像将一个大任务分成几个小任务,让多个工作人员同时处理每个任务。假设您要处理 100 张图像。与其同时处理一张图像,为什么不一次处理 5 张或 10 张呢?通过利用 CPU 的多个核心,可以节省大量时间。
🚀 Python与C++中的并行性
    如果你使用 Python,你可能听说过全局解释器锁 (GIL),它限制了线程的真正并行性。你可能想知道为什么 Python 在这方面会遇到困难。Python 的 GIL 确保单个进程中一次只有一个线程运行。这对于保证安全非常有用,但严重限制了图像处理等 CPU 密集型任务的性能。
    另一方面,C++ 可以让你充分利用多线程的强大功能。你可以使用 OpenMP 轻松地将任务分配到不同的 CPU 内核上,以最小的努力实现真正的并行性。

🚀 Python中使用Joblib 加速

import osimport cv2from glob import globfrom joblib import Parallel, delayed
input_folder = 'images/'output_folder = 'output/'
def convert_to_grayscale(image_path, output_folder): img = cv2.imread(image_path) gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) output_path = os.path.join(output_folder, os.path.basename(image_path)) cv2.imwrite(output_path, gray_img)
if __name__ == "__main__": # get a list of abs path for all .jpg files whitin input_folder image_files = glob(f"{input_folder}/*.jpg")
# Parallel processing using Joblib Parallel(n_jobs=-1, backend="threading")(delayed(convert_to_grayscale)(image, output_folder) for image in image_files)
    在这里,Joblib将图像处理任务拆分到多个 CPU 核心上。只需设置n_jobs=-1,所有可用核心都会被利用。
🚀 C++中使用OpenMP实现真正的多线程
    OpenMP 是处理 C++ 中并行性的一种简单方法,可让您轻松并行化循环。对于将图像转换为灰度等 CPU 密集型任务,它非常高效。
    首先,您需要安装 OpenCV 并设置 OpenMP。以下是快速设置指南:
    1. 如果你还没有安装 OpenCV,先安装它
sudo apt-get install libopencv-dev
    2. 确保您拥有OpenMP(大多数现代编译器(如 GCC 和 Clang)都具有开箱即用的 OpenMP 支持)。
    3. 要使用 OpenMP 编译 C++ 代码,请使用:
g++ -fopenmp -o image_converter image_converter.cpp `pkg-config --cflags --libs opencv4`
    fopenmp标志是启用OpenMP的标志。
    现在,让我们看一下代码:
#include <opencv2/opencv.hpp>#include <omp.h>#include <filesystem>#include <string>
void convert_to_grayscale(const std::string& input_path, const std::string& output_folder){ cv::Mat img = cv::imread(input_path); cv::Mat gray_img; cv::cvtColor(img, gray_img, cv::COLOR_BGR2GRAY); std::string output_path = output_folder + "/" + std::filesystem::path(input_path).filename().string(); cv::imwrite(output_path, gray_img);}
int main(){ std::string input_folder = "images/"; std::string output_folder = "output/";
std::vector<std::string> image_files; for (const auto& entry : std::filesystem::directory_iterator(input_folder)) { image_files.emplace_back(entry.path().string()); }
// Parallel processing using OpenMP #pragma omp parallel for for (size_t i = 0; i < image_files.size(); ++i) { convert_to_grayscale(image_files[i], output_folder); }
return 0;}
    代码中的#pragma omp parallel for让每个线程处理循环的一部分,将工作负载分布在多个 CPU 核心上。与Python不同,C++可以真正并行运行线程,而不会受到 GIL 的限制。
🚀 总结
    通过利用并行计算,可以显著减少处理大量图像所需的时间。无论你使用 Python 还是 C++,都可以使用工具来加快工作流程。
    在 Python 中,我们使用 Joblib 解决了 GIL 问题。对于更强大的多线程,C++ 与 OpenMP 的结合将带来翻天覆地的变化。
    代码下载:
https://github.com/Gabriellgpc/multhreading-image-processing?source=post_page-----9a8895115ef8--------------------------------

—THE END—

觉得有用,麻烦给个赞和在看 

机器视觉与AI深度学习
专注于机器视觉、AI、深度学习等技术最新资讯、实战内容及应用案例的分享,交流!
 最新文章