如何以CV_16UC1的方式读取JPG图像并在屏幕上打印?

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

本文关键字:图像 屏幕 打印 JPG 读取 CV 16UC1 方式      更新时间:2023-10-16

我想在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 位无符号 Mat 的像素值范围介于 0 和 255 之间,因此,当您从文件加载图像并显示它们时,每个像素将越接近最大值 255 越亮。

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

"如何以CV_16UC1的方式阅读JPG图像并在屏幕上打印?">

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