如何将 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,他们就会失去大部分他们拥有的信息,并且没有神奇的方法可以恢复它。
我想在 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,他们就会失去大部分他们拥有的信息,并且没有神奇的方法可以恢复它。