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

时间:2017-05-30 16:05:25

标签: c++ opencv computer-vision

我想在JPGCV_16UC1)中以OpenCV的形式阅读C++张图片。

我也可以从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

1 个答案:

答案 0 :(得分:1)

8位无符号Mat的像素值介于0到255之间,因此,当您从文件加载图像并显示它们时,每个像素将越亮,越接近255,即最大值。

当你将这些图像转换为16Bit-Unsigned时,像素将保持相同的绝对值(介于0和255之间),但现在数据结构的最大值为65535.所以,这一点都不奇怪图像很暗。即使较高的值(255)在新分辨率中仍然如此之低,以至于它看起来不存在。

  

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

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