gpt4 book ai didi

c++ - YUV 图像中的像素

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:23 28 4
gpt4 key购买 nike

我正在使用opencv来实现对象跟踪。我读到 YUV 图像比 RGB 图像更好用。我的问题是,尽管我花了很多时间阅读笔记,但我还是无法理解 YUV 格式。 Y 是亮度,我认为它是根据 R、G、B 分量的组合计算得出的。

我的主要问题是如何访问和操作 YUV 图像格式的像素。在 RGB 格式中,它很容易访问组件,因此可以使用像

这样的简单操作来更改它
src.at<Vec3b>(j,i).val[0] = 0; for example

但是在YUV中却不是这样。我需要帮助来访问和更改 YUV 图像中的像素值。例如,如果 RGB 中的像素是红色,那么我只想保留 YUV 中的相应像素,其余的将被删除。请帮我解决这个问题。

最佳答案

我建议在 HSV 或 LAB 而不是 RGB 中对您的图像进行操作。

来自相机的原始图像将采用 YCbCr(有时称为 YUV,我认为这是不正确的,但我可能是错的),并以类似于 YUYV(重复)的方式布局,所以如果你可以直接将其转换为 HSV,您将避免额外的复制和转换操作,从而节省您一些时间。但是,如果您正在处理视频或成批图像,这可能对您来说很重要。

下面是一些用于在 YCbCr 和 RGB 之间进行转换的 C++ 代码(一个使用整数数学,另一个使用 float ):

Colour::bgr Colour::YCbCr::toBgrInt() const
{
int c0 = 22987;
int c1 = -11698;
int c2 = -5636;
int c3 = 29049;

int y = this->y;
int cb = this->cb - 128;
int cr = this->cr - 128;

int b = y + (((c3 * cb) + (1 << 13)) >> 14);
int g = y + (((c2 * cb + c1 * cr) + (1 << 13)) >> 14);
int r = y + (((c0 * cr) + (1 << 13)) >> 14);

if (r < 0)
r = 0;
else if (r > 255)
r = 255;

if (g < 0)
g = 0;
else if (g > 255)
g = 255;

if (b < 0)
b = 0;
else if (b > 255)
b = 255;

return Colour::bgr(b, g, r);
}

Colour::bgr Colour::YCbCr::toBgrFloat() const
{
float y = this->y;
float cb = this->cb;
float cr = this->cr;

int r = y + 1.40200 * (cr - 0x80);
int g = y - 0.34414 * (cb - 0x80) - 0.71414 * (cr - 0x80);
int b = y + 1.77200 * (cb - 0x80);

if (r < 0)
r = 0;
else if (r > 255)
r = 255;

if (g < 0)
g = 0;
else if (g > 255)
g = 255;

if (b < 0)
b = 0;
else if (b > 255)
b = 255;

return Colour::bgr(b, g, r);
}

以及从 BGR 到 HSV 的转换:

Colour::hsv Colour::bgr2hsv(bgr const& in)
{
Colour::hsv out;

int const hstep = 255 / 3; // Hue step size between red -> green -> blue

int min = in.r < in.g ? in.r : in.g;
min = min < in.b ? min : in.b;

int max = in.r > in.g ? in.r : in.g;
max = max > in.b ? max : in.b;

out.v = max; // v
int chroma = max - min;
if (max > 0)
{
out.s = 255 * chroma / max; // s
}
else
{
// r = g = b = 0 // s = 0, v is undefined
out.s = 0;
out.h = 0;
out.v = 0; // it's now undefined
return out;
}

if (chroma == 0)
{
out.h = 0;
return out;
}

const int chroma2 = chroma * 2;
int offset;
int diff;

if (in.r == max)
{
offset = 3 * hstep;
diff = in.g - in.b;
}
else if (in.g == max)
{
offset = hstep;
diff = in.b - in.r;
}
else
{
offset = 2 * hstep;
diff = in.r - in.g;
}

int h = offset + (diff * (hstep + 1)) / chroma2;

// Rotate such that red has hue 0
if (h >= 255)
h -= 255;

assert(h >= 0 && h < 256);

out.h = h;

return out;

很遗憾,我没有一步完成此操作的代码。

您还可以使用 built-in OpenCV functions for colour conversion .

cvtColor(img, img, CV_BGR2HSV);

关于c++ - YUV 图像中的像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16514454/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com