如何将 JPG 图像读取为 CV_16UC1 并在屏幕上打印?

How to read JPG images as CV_16UC1 and print on screen?

我想在 OpenCV(在 C++ 中)将 JPG 图像作为 CV_16UC1 阅读。

我也可以从 CV_8UC3 转换为 CV_16UC1

下面的代码有效,但这里它只使用 CV_8UC3 格式,这不是我需要的:

using namespace cv;
int main()
{
    Mat im1 = imread("MyPic.JPG");
    Mat im2 = imread("MyPic.JPG");
    Size sz1 = im1.size();
    Size sz2 = im2.size();

    Mat final(sz1.height, sz1.width + sz2.width, CV_8UC3);
    Mat left(final, Rect(0, 0, sz1.width, sz1.height));
    im1.copyTo(left);

    Mat right(final, Rect(sz1.width, 0, sz2.width, sz2.height));
    im2.copyTo(right);

    imshow("final", final);
    waitKey(0);
    return 0;
 }

但是我需要用到CV_16UC1(这个真的需要!)。因此,我是这样转换的:

    cv::Mat im2 = cv::imread("MyPic.jpg");
    cv::Size sz2 = im2.size();

    cv::Mat im3; // I want im3 to be the CV_16UC1 of im2
    im2.convertTo(im3, CV_16UC1);
    cv::Size sz3 = im3.size();

    cv::Mat im1 = cv::imread("MyPic.jpg");
    cv::Size sz1 = im1.size();

    cv::Mat im4;
    im4.convertTo(im1, CV_16UC1);
    cv::Size sz4 = im4.size();

    // Two images by each other side - this must be CV_16UC1
    cv::Mat final(sz1.height, sz1.width + sz2.width, CV_16UC1);

    // The left image
    cv::Mat left(final, cv::Rect(0, 0, sz1.width, sz1.height));
    im1.copyTo(left);

    // The right image
    cv::Mat right(final, cv::Rect(sz1.width, 0, sz2.width, sz2.height));
    im4.copyTo(right);

    cv::imshow("final", final);

    cv::waitKey(0);

似乎我在转换或阅读方式上做错了,因为屏幕上没有显示图像。

如何从 CV_8UC3 正确转换为 CV_16UC1

8-Bit-Unsigned Mat 的像素值范围在 0 到 255 之间,因此,当您从文件中加载图像并显示它们时,每个像素越接近最大值 255 就会越亮。

当您将这些图像转换为 16 位无符号时,像素将保持相同的绝对值(介于 0 和 255 之间),但现在您的数据结构的最大值为 65535。因此,毫不奇怪所有这些图像都是黑暗的。即使是更高的值 (255) 在新分辨率下仍然会很低,看起来就像不存在一样。

"How to read JPG images as CV_16UC1 and print on screen?"

你不能。 .jpg 图像不是 CV_16UC1。如果您生成这些图像并认为它们会保存 16 位数据,那么它们不会。可能你没有正确保存它。一旦他们是 .jpg,他们就会失去大部分他们拥有的信息,并且没有神奇的方法可以恢复它。