c++ - 将每个 channel 像素与给定 vector 相乘

标签 c++ algorithm opencv math

基本上我想将图像的每个 channel 值与 vector 相乘。例如 Vec4f(1,2,3,4) 1 * 图像的红色 channel 2 * 绿色 channel 等等 这是我的代码(不是完整的代码并且有一些错误)但是我的老板说必须有更好更简单的方法使用 opencv 但我找不到。提前致谢。

      void scaleImage(TextureData& dst, TextureData const& src, cv::Vec4f 
      const& scale)
      {


auto size = src.info.size;
dst=src;
cv::Mat bgr[4];
cv::split(src.levels[0].images[0], bgr);

for (int y = 0; y < size.height; ++y)
{
    for (int x = 0; x < size.width; ++x)
    {

        src.levels[0].images[0].channels();

        if (src.levels[0].images[0].channels() == 4)
        {
            auto& imgRGB = dst.levels[0].images[0].at<cv::Vec4f>(x, y);
            imgRGB[3] = static_cast<uint8_t>(scale.w()*bgr[3].at[x, y]);
            imgRGB[2] = static_cast<uint8_t>(scale.x()*bgr[2].at[x, y]);
            imgRGB[1] = static_cast<uint8_t>(scale.y()*bgr[1].at[x, y]);
            imgRGB[0] = static_cast<uint8_t>(scale.z()*bgr[0].at[x, y]);

        }

        if (src.levels[0].images[0].channels() == 3)
        {
            auto& imgRGB = dst.levels[0].images[0].at<cv::Vec3f>(x, y);
            imgRGB[2] = static_cast<uint8_t>(scale.x()*bgr[2].at[x, y]);
            imgRGB[1] = static_cast<uint8_t>(scale.y()*bgr[1].at[x, y]);
            imgRGB[0] = static_cast<uint8_t>(scale.z()*bgr[0].at[x, y]);
        }

        if (src.levels[0].images[0].channels() == 2)
        {
            auto& imgRGB = dst.levels[0].images[0].at<cv::Vec2f>(x, y);
            imgRGB[1] = static_cast<uint8_t>(scale.x()*bgr[2].at[x, y]);
            imgRGB[0] = static_cast<uint8_t>(scale.y()*bgr[1].at[x, y]);
        }

        if (src.levels[0].images[0].channels() == 2)
        {
            auto& imgRGB = dst.levels[0].images[0].at<float>(x, y);
            imgRGB[0] = static_cast<uint8_t>(scale.x()*bgr[2].at[x, y]);
        }

    }
}

最佳答案

好吧,这是一个有点奇怪的问题。我认为没有人需要此功能,但以防万一……因为它会花费我 2-3 天(仅 25 行)

  void scaleImage(TextureData& dst, TextureData const& src, Vec4f const& 
  scale)
  {    
   std::vector<cv::Mat> bgr(3);
   std::vector<cv::Mat> resultMask(3);
   src.info;

  cv::split(src.levels[0].images[0], bgr);
  //dst = src;
  //auto size = src.info.size;

   cv::Point anchor = cv::Point(-1, -1);

        float a = scale.x();
        float b = scale.y();
        float c = scale.z();
        float d = scale.w();
        cv::Mat kern = (cv::Mat_<float>(3, 3) << 0, 0, 0,
                                                 0, a, 0,
                                                 0, 0, 0);
        cv::Mat kern1 = (cv::Mat_<float>(3, 3) << 0, 0, 0,
                                                 0, b, 0,
                                                 0, 0, 0);
        cv::Mat kern2 = (cv::Mat_<float>(3, 3) << 0, 0, 0,
                                                 0, c, 0,
                                                 0, 0, 0);
        cv::Mat kern3 = (cv::Mat_<float>(3, 3) << 0, 0, 0,
                                                 0, d, 0,
                                                 0, 0, 0);
        cv::filter2D(bgr[0], resultMask[0], bgr[0].depth(), kern,  anchor, 0, 1);
        cv::filter2D(bgr[1], resultMask[1], bgr[1].depth(), kern1, anchor, 0, 1);
        cv::filter2D(bgr[2], resultMask[2], bgr[2].depth(), kern2, anchor, 0, 1);
        //cv::filter2D(bgr[3], resultMask[3], bgr[3].depth(), kern3, anchor, 0, 1);

        cv::merge(resultMask, dst.levels[0].images[0]);

关于c++ - 将每个 channel 像素与给定 vector 相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43590995/

相关文章:

c++ - 通过 VCL 异常例程捕获 C++ 异常

python - 求多个根的二分法

algorithm - Go:多个 len() 调用与性能?

android - Android 版 OpenCV : Convert Camera preview from YUV to RGB with Imgproc. cvtColor

c++ - 将文件中的数据放入字符数组不会在最后一个数据处停止

c++ - 如何将 QList 从 QML 传递到 C++/Qt?

c++ - C++中的尾递归

python - 如何使用 CUDA 或 OpenCL 加速 block 匹配算法?

android - OpenCV undefined reference `cv::fastFree(void*)'

opencv - 如何平均两个面具?