【问题标题】:Conversion from YBR_FULL to RGB in c++?在 C++ 中从 YBR_FULL 转换为 RGB?
【发布时间】:2023-12-06 09:49:01
【问题描述】:

您能否解释一下 YBR_FULL 和 RGB 之间的关系,以便我能够在 C++ 中将 YBR_FULL 图像转换为 RGB?

我使用 DCMTK 库从 Dicom 图像中获取像素数据作为缓冲区中的字节。对于某些选定的像素,我将像素值设置为 0,对于 RGB,当图像可视化时,设置为 0 的像素值显示为黑色,但在 YBR_FULL 的情况下,这些像素显示为绿色。我不太明白问题是什么。你能详细说明我在做什么错误吗?

【问题讨论】:

    标签: c++ image image-processing rgb dicom


    【解决方案1】:

    这个问题已经回答了

    Create BufferedImage from YBR_FULL Dicom Image

    这是数学公式的链接

    http://www.fourcc.org/fccyvrgb.php

    【讨论】:

    • 使用这些公式渲染变慢了。
    【解决方案2】:

    如果您将 YBR 值设置为 (0,0,0),则您的亮度 (Y) 处于正确值,但色度(B 和 R)零点正好在范围的中间,所以您应该尝试使用值 128(如果 B 和 R 有一个字节大小)。那么你有 YBR = (0, 128U, 128U)

    【讨论】:

    • 对不起我的愚蠢,但 128U 是指 128?就像buffer 是存储像素值的缓冲区,然后将 YBR 值设置为 0,我应该这样做 buffer[index] = 0, buffer[index+1] = 128, buffer[index+2] = 128?
    • 128U 表示 128 但考虑到无符号字节(或字符)。有许多 YBR 布局和类型,例如,如果它是平面的,那么您的缓冲区中首先有所有 Y 值,然后是所有 B 值,最后是所有 R 值,如果是交错的,则有许多交错模式。我会看看 DCMTK lib 看看是如何排序的
    • 我正在处理平面图像,我设置 Y = 0、B = 128、R = 128 以使这些像素变黑。但是什么也没做,它一直显示绿色。我尝试按照以下链接中的代码进行操作:gdcm.sourceforge.net/html/… 从 RGB 到 YBR 的转换有效,但从 RGB 到 YBR 无效。我不知道为什么它不起作用。我在 RGB 到 YBR 转换期间的任务是将一些特定像素设置为黑色,但这些像素一直显示为绿色
    • 好吧,我前段时间遇到了同样的问题,看到这张图片en.wikipedia.org/wiki/File:YCbCr-CbCr_Scaled_Y50.png,绿色在左下方,所以零值是刻度的中间。在我的情况下它有效,我不明白为什么在你的情况下不起作用。我唯一能想到的是有很多平面模式(YBR422、YBR420 等等),你可能会改变错误的像素色度。