【问题标题】:Image with only the red component from RGB 565仅具有 RGB 565 红色分量的图像
【发布时间】:2025-12-28 23:35:11
【问题描述】:

你好,这是我正在使用的部分代码,

                b=(byte2&0xF8)<<8;  //F8=11111000   5
                g=(byte2&0xFC)<<3;  //FC=11111100   6
                r=(byte2&0xF8)>>3;  //F8=11111000   5
                grisColor=(r)|(g)|(b);

它使用 RGB 565 的 OV7670 相机拍照,我需要修改什么才能拍摄只有红色分量的照片?

提前非常感谢

【问题讨论】:

  • 为语言添加标签可以帮助知道你在说什么的人找到你的问题。

标签: c++ c colors rgb


【解决方案1】:

我注意到您的目标是从 ov7670 获得 8 位灰度图像。
通过将 ov7670 设置为输出 yuv422 并将该数据“转换”为灰度(只需使用 Y 分量并忽略),您会获得更好的结果U 和 V 分量)。

我有一个 github 存储库,其中包含一些用于配置 ov7670 的有用功能。
查看名为 yuv422_ov7670 https://github.com/ComputerNerd/ov7670-no-ram-arduino-uno/blob/master/ov7670_regs.h 的寄存器列表

【讨论】:

    【解决方案2】:

    一旦你有了 5 位红色,下一个问题是,你想要灰度输出(例如单个八位字节),还是只填充红色(绿色和蓝色为零)的 RGB565,还是 RGB565 灰度输出,还是 RGB24,...?

    【讨论】:

    • 是的,我正在获得 BGR。是的,我想要 8 位灰度输出。谢谢
    • 所以如果你已经在r 中有 b00011111,你可以直接使用它,除非你没有 0-255 的范围,所以你可以轻松地缩放它,例如四舍五入:( (int)r * 255 + 15 ) / 31;
    • 这是扩展范围的一种相当缓慢的方法。通常完成的快速方法是:(r&lt;&lt;3 | r&gt;&gt;2).
    【解决方案3】:

    只注释掉最后一行的结尾:

    grisColor=(r);//|(g)|(b);
    

    和/或将gb 设置为零。

    【讨论】: