- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将图像从 RBG(OpenCV 中的 BGR)手动转换为 YCbCr 色彩空间。
我的图像是一张 png
彩色图像,宽度为 800,高度为 600,3 个 channel ,16 位深度。
这是我尝试解决这个问题的方法。
cv::Mat convertToYCbCr(cv::Mat image) {
// converts an RGB image to YCbCr
// cv::Mat: B-G-R
std::cout << "Converting image to YCbCr color space." << std::endl;
int i, j;
for (i = 0; i <= image.cols; i++) {
for (j = 0; j <= image.rows; j++) {
// R, G, B values
auto R = image.at<cv::Vec3d>(j, i)[2];
auto G = image.at<cv::Vec3d>(j, i)[1];
auto B = image.at<cv::Vec3d>(j, i)[0];
// Y'
auto Y = image.at<cv::Vec3d>(j,i)[0] = 0.299 * R + 0.587 * G + 0.114 * B + 16;
// Cb
auto Cb = image.at<cv::Vec3d>(j,i)[1] = 128 + (-0.169 * R -0.331 * G + 0.5 * B);
// Cr
auto Cr = image.at<cv::Vec3d>(j,i)[2] = 128 + (0.5 * R -0.419 * G -0.081 * B);
std::cout << "At conversion: Y = " << Y << ", Cb = " << Cb << ", "
<< Cr << std::endl;
}
}
std::cout << "Converting finished." << std::endl;
return image;
}
我收到的图像是这样的:
我期待的是这个(使用 OpenCV 方法):
垂直线可能暗示了什么?我的循环错了吗?我什至可以用 YCbCr 值“替换”RGB 值并期望图像看起来像示例吗? typeid()
为两个图像返回相同的值,N2cv3MatE
。
最佳答案
观察到错误结果的主要原因是用于访问图像的数据类型不正确。访问 16 位无符号像素的正确类型是 cv::Vec3w
(不是 cv::Vec3d
)。
下一个问题是用于转换的系数是为模拟信号 (YPbPr) 设计的。对于数字图像,我们必须使用为数字图像设计的系数 ( YCbCr )。您可以在 Wikipedia article on YCbCr 上找到更多详细信息在 ITU-R BT.601 转换部分。
文章中缺少的一条信息是,如果图像是 16 位无符号深度或 32 位浮点深度,系数将如何变化?答案是我们必须根据图像的位深度缩放系数。
对于 16 位无符号深度的图像,缩放应按如下方式执行:
auto Y = (R * 65.481f * scale) + (G * 128.553f * scale) + (B * 24.966f * scale) + (16.0f * offset);
auto Cb = (R * -37.797f * scale) + (G * -74.203f * scale) + (B * 112.0f * scale) + (128.0f * offset);
auto Cr = (R * 112.0f * scale) + (G * -93.786f * scale) + (B * -18.214f * scale) + (128.0f * offset);
其中 scale
等于 257.0/65535.0
,offset
等于 257.0
。
此转换技术已从 rgb2ycbcr
的 MATLAB 源代码中采用引用以下描述缩放比例的书的函数:
C.A. Poynton, "A Technical Introduction to Digital Video", John Wiley & Sons, Inc., 1996, Chapter 9, Page 175`
既然转换已经完成,我们面临的第三个问题就是类似于OpenCV的图像可视化。当我们使用 OpenCV 执行颜色转换时,输出图像以 YCrCb
顺序存储,而不是通常的 YCbCr
。因此,要使用我们的自定义转换逻辑获得相同的图像,我们必须以相关顺序存储值。
示例转换代码可能如下所示:
if(image.type() == CV_16UC3)
{
const float scale = 257.0f / 65535.0f;
const float offset = 257.0f;
for (int i = 0; i < image.cols; i++)
{
for (int j = 0; j < image.rows; j++)
{
auto R = image.at<cv::Vec3w>(j, i)[2];
auto G = image.at<cv::Vec3w>(j, i)[1];
auto B = image.at<cv::Vec3w>(j, i)[0];
auto Y = (R * 65.481f * scale) + (G * 128.553f * scale) + (B * 24.966f * scale) + (16.0f * offset);
auto Cb = (R * -37.797f * scale) + (G * -74.203f * scale) + (B * 112.0f * scale) + (128.0f * offset);
auto Cr = (R * 112.0f * scale) + (G * -93.786f * scale) + (B * -18.214f * scale) + (128.0f * offset);
image.at<cv::Vec3w>(j, i)[0] = (unsigned short)Y;
image.at<cv::Vec3w>(j, i)[1] = (unsigned short)Cr;
image.at<cv::Vec3w>(j, i)[2] = (unsigned short)Cb;
}
}
}
关于c++ - BGR -> YCbCr 转换工作不正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56725115/
我正在寻找将具有 444 YCbCr 的 JPEG 转换为 422 YCbCr 的可能性。根据 RFC 2435 for RTP Streaming,JPEG 文件必须具有 JPEG 422 YCbC
我目前正在从事一个涉及色彩空间的项目。我不太明白 Cb 和 Cr 在 YCbCr 颜色空间中的含义。维基百科说“蓝差和红差色度分量”,但我不明白它们的意思。 YCbCr 在图像处理方面比 RGB 或
我正在尝试从处于 Ycbcr 颜色模式的帧中获取像素的 Y 值。这是我写的: cv::Mat frame, Ycbcrframe, helpframe; ........ cvtColor(fra
尝试在 YCbCr 模式下创建 PIL 镜像甚至会在我的 ubuntu 11.04 中从 synaptic 安装新的 python/PIL 时崩溃 wim@wim-ubuntu:~$ python P
我正在使用 OpenCV 从多个摄像头捕获实时数据: capture = cvCaptureFromCAM(cameraNo) 现在,我需要将图像转换为 YCbCr 色彩空间。我意识到我可以使用 cv
我正在尝试将图像从 RBG(OpenCV 中的 BGR)手动转换为 YCbCr 色彩空间。 我的图像是一张 png 彩色图像,宽度为 800,高度为 600,3 个 channel ,16 位深度。
我正在使用 PIL 在 Python 中进行一些图像处理,我需要从一系列图像中提取亮度层,并使用 numpy 对其进行一些处理,然后将编辑后的亮度层放回图像中并保存.问题是,我似乎无法以 YCbCr
我一直在尝试在 Vulkan 中对 YCbCr 图像进行采样,但我一直得到不正确的结果,我希望有人能够发现我的错误。 我有一个 NV12 YCbCr 图像,我想将它渲染到两个三角形上,形成一个四边形。
下面是一个将 RGB 转换为 YCbCr 的矩阵。你能告诉我如何获得将 YCbCr 转换为 RGB 的公式吗?我的意思是,我有可用的 YCbCr 值,我想从中获取 RGB。 最佳答案 如果您询问公式是
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我需要从 JPEG 图像中提取 CbCr 色度数据,用于图像分析。 (在 C/C++ 中) 据我了解,JPEG“原始数据”是经过压缩的 YCbCr。我的这个假设是否正确?如何针对给定图像验证这一点?
我正在尝试使用 python 进行 JPEG 压缩。我加载了一个 tiff 图像并将其存储为 numpy uint8 RGB 数组。我这样做是为了颜色映射。 def rgb2ycbcr(im):
我需要将 RGB 图像转换为 YCbCr 颜色空间,但有一些颜色偏移问题,我使用了所有公式并得到了相同的结果。 python 中的公式 cbcr[0] = int(0.299*rgb[0]
我有具有 YCbCr 色彩空间的图像。但我想让它们变成 CMYK。我怎么做? Perl 解决方案会很棒。命令行 (Ubuntu) 解决方案会很好。 我试过使用 ImageMagick,但我的图像大多是
如何将BitmapFactory.decodeFile()返回的Bitmap转成YUV格式(类似于相机的onPreviewFrame()返回字节数组)? 最佳答案 下面是一些实际工作的代码:
我在尝试使用一些不同的图像格式时遇到了一些我觉得很奇怪的事情。当从 RGB 转换为 YCbCr 然后再转换回 RGB 时,结果与我开始时的结果非常相似(像素值的差异几乎总是小于 4)。但是,当我从 Y
有一个来自 http://www.delphiffmpeg.com 的视频编码示例- 需要将一组TBitmaps转换成YCbCr(YUV),我们应该怎么做呢?该示例包含虚拟颜色: (* encod
在 OpenCV (Python) 中,要将 RGB 转换为 YCbCr,我们使用: imgYCC = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB) 如果我想回到 R
我需要将加载到 BufferedImage 的位图中的颜色从 RGB 转换为 YCbCr(亮度和 2 channel 色度),并在处理后转换回来。 我在每个像素的主方法中使用像 rgb2ycbcr()
我有 8 位的 Y、Cb、Cr 值,你能给我简单的 C 函数,将它转换为 8 位的 R、G、B。 这是它的原型(prototype)。 void convertYCbCrToRGB( unsi
我是一名优秀的程序员,十分优秀!