我想在JPG
(CV_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
?
答案 0 :(得分:1)
8位无符号Mat的像素值介于0到255之间,因此,当您从文件加载图像并显示它们时,每个像素将越亮,越接近255,即最大值。
当你将这些图像转换为16Bit-Unsigned时,像素将保持相同的绝对值(介于0和255之间),但现在数据结构的最大值为65535.所以,这一点都不奇怪图像很暗。即使较高的值(255)在新分辨率中仍然如此之低,以至于它看起来不存在。
“如何将JPG图像读取为CV_16UC1并在屏幕上打印?”
你做不到。 .jpg图像不是CV_16UC1。如果您生成这些图像并认为它们将保留16位数据,则它们不会。可能你没有正确保存它。一旦它们是.jpg,它们就会失去大部分信息,并且没有神奇的方法来恢复它。