像素类型的imread

Ste*_*ing 4 c++ opencv

imread create的默认像素类型是什么?我测试了不同的图像,它们都给了我带有不同通道的unsigned char.如果我不明确地询问它,imread是否会创建带有signed char的像素类型?

cv::Mat img = cv::imread("lena.jpg", -1); //always give me unsigned char
Run Code Online (Sandbox Code Playgroud)

我检查了cv :: imread的文档,但它没有说明imread create的默认像素.

文档链接 http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#Mat imread(const string&filename,int flags)

sga*_*zvi 12

大多数.jpg图像是8位图像.因此,他们的默认数据类型是unsigned charchar.

有些图像喜欢.png或者.tif也支持16位像素值,因此它们的数据类型是unsigned short.但它没有必要,因为它们可能是8位.

要在OpenCV中按原样加载图像,请使用imread,如下所示:

cv::Mat img = cv::imread(imagePath, CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH);
Run Code Online (Sandbox Code Playgroud)

这些标志有不同的组合:

加载为8位(无论原始深度是多少):

CV_LOAD_IMAGE_COLOR

加载原始深度:

CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYDEPTH

以灰度加载(无论图像有多少通道):

CV_LOAD_IMAGE_GRAYSCALE

以原始深度加载为灰度:

CV_LOAD_IMAGE_GRAYSCALE| CV_LOAD_IMAGE_ANYDEPTH

在你的情况下,lena.jpg是8位图像,所以你得到unsigned char数据类型.

更新:

对于较新版本的OpenCV,请使用C++接口中枚举定义的标志.只需更换CV_LOAD_IMAGE_*cv::IMREAD_*.

例如CV_LOAD_IMAGE_GRAYSCALE成为cv::IMREAD_GRAYSCALE.