您好我想转换图片中的颜色,我使用的是每像素方法,但似乎很慢
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来做到这一点?将像素更改为我想要的颜色?
答案 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()
(如果可能)可以提供巨大的加速,但设计/编码更加密集。