OpenCV每个像素转换颜色

时间:2015-05-27 14:23:48

标签: android opencv image-processing colors pixel

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

Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    credentials = SignedJwtAssertionCredentials(json_key['client_email'], json_key['private_key'], scope)
  File "C:\Python33\lib\site-packages\oauth2client\util.py", line 137, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "C:\Python33\lib\site-packages\oauth2client\client.py", line 1515, in __init__
    self.private_key = base64.b64encode(private_key)
  File "C:\Python33\lib\base64.py", line 58, in b64encode
    raise TypeError("expected bytes, not %s" % s.__class__.__name__)
TypeError: expected bytes, not str

我的问题,有什么方法可以使用openCV来做到这一点?将像素更改为我想要的颜色?

2 个答案:

答案 0 :(得分:1)

您可以使用以下方式访问像素:

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,如果你想迭代所有Pixel,可以快速访问图像像素。我想从本文中选择的方法是迭代器方法,因为它只比直接指针访问稍慢但使用起来更安全。

示例代码:

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;
}

答案 1 :(得分:1)

关于如何访问/修改opencv图像缓冲区,我建议this excellent article。我建议 &#34;有效的方式&#34;:

 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]];
        }

或&#34;迭代器安全方法&#34;:

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()(如果可能)可以提供巨大的加速,但设计/编码更加密集。