gpt4 book ai didi

c++ - C++ 中 channel 函数应用的通用机制?

转载 作者:行者123 更新时间:2023-11-28 03:00:35 25 4
gpt4 key购买 nike

OpenCV 中经常出现的一个问题是如何将单 channel 函数应用于多 channel 图像(例如 color depth reduction with cv::LUT )。一般情况很简单:

  1. 跨 channel 分割图像;
  2. 将函数应用于单独的 channel ;
  3. 从 channel 输出组装结果图像。

但是,当唯一改变的是应用于 channel 的函数(以及奇怪的额外参数)时,我必须一遍又一遍地编写相同的算法,这有点愚蠢。

OpenCV 是否提供上述算法的通用实现——一些将单 channel 函数应用于多 channel 图像的每个 channel 的机制?

如果不是,您建议如何用 C++ 解决这个问题?一个宏可以解决这个问题,但它会是一个有点复杂的宏,又大又丑。如果可用的话,我更喜欢更优雅的解决方案。

最佳答案

FP为了救援。 ;)

您不需要宏。 std::function提供我们所需的一切:

#include <opencv2/opencv.hpp>
#include <functional>
#include <iterator>

// Apply a given function to every channel of an image.
cv::Mat ApplyToChannels(const cv::Mat& img,
const std::function<cv::Mat(const cv::Mat& src)>& f)
{
// Split image.
std::vector<cv::Mat> channelsIn;
cv::split(img, channelsIn);

// Apply function to channels.
std::vector<cv::Mat> channelsOut;
std::transform(begin(channelsIn), end(channelsIn),
std::back_inserter(channelsOut), [&f](const cv::Mat& channel)
{
return f(channel);
});

// Merge image.
cv::Mat result;
cv::merge(channelsOut, result);
return result;
}

cv::Mat Identity(const cv::Mat& src)
{
return src;
}

cv::Mat Sobel(const cv::Mat& src)
{
cv::Mat result;
cv::Sobel(src, result, src.depth(), 1, 1);
return result;
}

int main()
{
// Lamdas also work.
auto Blur = [](const cv::Mat& src) -> cv::Mat
{
cv::Mat result;
cv::blur(src, result, cv::Size(15, 15));
return result;
};

// Create test image and draw something on it.
cv::Mat image(120, 160, CV_8UC3, cv::Scalar(0, 0, 0));
cv::line(image, cv::Point(32, 32), cv::Point(120, 80),
cv::Scalar(56, 123, 234), 28);

// Apply two different operations.
auto image2 = ApplyToChannels(image, Sobel);
auto image3 = ApplyToChannels(image, Blur);

// Save results.
cv::imwrite("1.png", image);
cv::imwrite("2.png", image2);
cv::imwrite("3.png", image3);
}

如果你想让你的函数更通用,你可以使用std::bind等来设置例如 sobel 参数。

enter image description here enter image description here enter image description here

关于c++ - C++ 中 channel 函数应用的通用机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20945933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com