OpenCV 转换每像素颜色

OpenCV convert color per pixel

您好,我想转换图像中的颜色,我使用的是逐像素方法,但速度似乎很慢

src.getPixels(pixels, 0, width, 0, 0, width, height);

        // RGB values
        int R;

        for (int i = 0; i < pixels.length; i++) {
            // Get RGB values as ints


            // Set pixel color
            pixels[i] = color;

        }

        // Set pixels
        src.setPixels(pixels, 0, width, 0, 0, width, height);

我的问题是,有什么方法可以使用 openCV 来实现吗?将像素更改为我想要的颜色?

您可以使用以下方式访问 Pixels:

img.at<Type>(y, x);

因此,要更改 RGB 值,您可以使用:

// read color
Vec3b intensity = img.at<Vec3b>(y, x);

// compute new color using intensity.val[0] etc. to access color values

// write new color
img.at<Vec3b>(y, x) = intensity;

@Boyko 提到了来自 OpenCV 的 Article,如果您想遍历所有像素,则可以快速访问图像像素。我更喜欢这篇文章中的方法是迭代器方法,因为它只比直接指针访问慢一点,但使用起来更安全。

示例代码:

Mat& AssignNewColors(Mat& img)
{
    // accept only char type matrices
    CV_Assert(img.depth() != sizeof(uchar));

    const int channels = img.channels();
    switch(channels)
    {
    // case 1: skipped here
    case 3:
        {
         // Read RGG Pixels
         Mat_<Vec3b> _img = img;

         for( int i = 0; i < img.rows; ++i)
            for( int j = 0; j < img.cols; ++j )
               {
                   _img(i,j)[0] = computeNewColor(_img(i,j)[0]);
                   _img(i,j)[1] = computeNewColor(_img(i,j)[1]);
                   _img(i,j)[2] = computeNewColor(_img(i,j)[2]);
            }
         img = _img;
         break;
        }
    }

    return img;
}

我推荐 this excellent article 如何 access/modify 一个 opencv 图像缓冲区。我建议 "the efficient way":

 int i,j;
    uchar* p;
    for( i = 0; i < nRows; ++i)
    {
        p = I.ptr<uchar>(i);
        for ( j = 0; j < nCols; ++j)
        {
            p[j] = table[p[j]];
        }

或"the iterator-safe method":

MatIterator_<Vec3b> it, end;
for( it = I.begin<Vec3b>(), end = I.end<Vec3b>(); it != end; ++it)
{
   (*it)[0] = table[(*it)[0]];
   (*it)[1] = table[(*it)[1]];
   (*it)[2] = table[(*it)[2]];
}

为了进一步优化,使用 cv::LUT()(在可能的情况下)可以提供巨大的加速,但它比 design/code 更密集。