如何在 OpenCV 中使用 16 位灰度



我找不到这些问题的答案:

  1. 我可以使用 OpenCV 显示 16 位灰度图片吗?我尝试了imshow()但OpenCV创建的窗口上没有任何内容。

  2. 如何将 16 位灰度图片转换为 B5G6R5 图片?我应该用什么参数创建cv::Mat来存储此结构?我尝试了cv::cvtColor(m_cvTmp, tmp, CV_GRAY2BGR565)但这个功能一直崩溃。有关其他图像转换的文档没有给出答案。

PS:我要处理的图像已经在内存中。

根据imshow的文档,它会自动将16位灰度缩放到8位,以便在屏幕上显示。我使用以下程序对此进行了测试:

#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace std;
int main(int argc, char *argv[]) {
    cv::Mat image;
    image = cv::imread("pic2.jpg");
    if (!image.data) {
        std::cout << "Image file not foundn";
        return 1;
    }
    cv::cvtColor(image, image, CV_BGR2GRAY);
    cv::Mat pic16bit;
    image.convertTo(pic16bit, CV_16U, 255); //convert to 16-bit by multiplying all values by 255
    // create image window named "asdfasdf"
    cv::namedWindow("asdfasdf");
    // show the image on window
    cv::imshow("asdfasdf", pic16bit);
    // wait for key
    cv::waitKey(0);
    return 0;
}

它按预期显示了灰度图像。因此,如果您只是得到一个空白窗口,我的猜测是您从其他库到 cv::Mat 的转换无法正常工作。例如,当我第一次尝试从 8 位转换为 16 位时,我得到了全黑图像,因为我忘记将所有 8 位值乘以 255。

作为调试的第一步,我会尝试在 16 位灰度 cv::Mat 中显示部分或全部值。

此外,作为一般规则,如果您的问题中只有一个问题,堆栈溢出效果最佳。当有多个问题时,您最终会得到多个有效答案,但您只能接受其中一个。

1)你必须看看这个文档。

您的代码将如下所示:

Mat imageGrey = imread("<image_name>", CV_LOAD_IMAGE_GRAYSCALE);

2)

Mat imageGrey = imread("<image_name>", CV_LOAD_IMAGE_GRAYSCALE);
Mat imageBGR;
cvtColor(imageGrey, imageBGR, CV_GRAY2BGR565);

行得通吗?

相关内容

  • 没有找到相关文章

最新更新