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 更密集。
您好,我想转换图像中的颜色,我使用的是逐像素方法,但速度似乎很慢
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 更密集。