在OpenCV中,8位颜色和32位颜色分别代表以下意义:

8位颜色:每个像素点用8位来表示颜色信息,即每个像素点可以表示256种颜色。在OpenCV中,常用的8位颜色格式有:灰度图像(1个通道)、BGR图像(3个通道)、RGBA图像(4个通道)等。32位颜色:每个像素点用32位来表示颜色信息,即每个像素点可以表示2^32种颜色,这远远超过了人眼所能识别的颜色范围。在OpenCV中,常用的32位颜色格式有:BGRA图像(4个通道)等。

需要注意的是,8位颜色和32位颜色在显示效果上是有区别的,前者颜色变化比较平滑,而后者则颜色变化更加细腻。同时,由于32位颜色的存储空间更大,因此在处理图像时,使用32位颜色格式可能会占用更多的内存空间。

在读取图片对图片进行操作时,发现了一个问题:  

cv::Mat src2 = cv::imread("image/ndvi.tif",cv::IMREAD_UNCHANGED);

std::cout << "typeid(hsv.size()).name() " <

std::cout << "hsv.channels() " <

std::cout << "hsv.type() " <

std::cout <<"hsv.size() " << src2.size()<< std::endl;

输出:

typeid(hsv.size()).name() class cv::Size_

hsv.channels() 1

hsv.type() 5

hsv.size() [1600 x 1300]

这些输出都没问题。但是imshow展示图片时报错。

原因在于:一般imshow展示的是8位颜色图像,因此16位/24位/32位颜色的都需要转换

在8位颜色图像中,每个像素的颜色值的取值范围是0到255,而在32位颜色图像中,每个像素的颜色值通常是浮点数(例如,0.0到1.0之间的值),这意味着其取值范围比8位颜色图像更大。如果不将像素值乘以255,那么在8位颜色范围内无法表达32位颜色图像中的所有颜色变化,因此需要将其缩放到8位范围内以便显示。

最简单的方法:乘以255就行了。

cv::Mat img = cv::imread("image.png", cv::IMREAD_UNCHANGED);

cv::imshow("image", img * 255); // 乘以255以显示图像

但是,在使用src2 * 255的时候,OpenCV会将图像的数据类型转换为CV_32F,然后对每个像素值都乘以255,最终得到的结果仍为CV_32F类型。这个过程中可能会导致数据类型转换带来的精度损失。

可以:

cv::Mat img32;

// 加载32位的单通道图像

img32 = cv::imread("image.tif", cv::IMREAD_ANYDEPTH | cv::IMREAD_GRAYSCALE);

// 将像素值缩放到8位范围内

cv::normalize(img32, img32, 0, 255, cv::NORM_MINMAX);

// 显示图像

cv::imshow("32-bit image", img32);

cv::waitKey(0);

总的来说就是缩放映射到0-255区间。

那如何通过opencv获取颜色位数呢?

cv::Mat img = cv::imread("image.png", cv::IMREAD_UNCHANGED);

int depth = img.depth(); // 获取图像的颜色位数,返回的是枚举类型的值

int color_bits = 0;

switch (depth) {

case CV_8U:

case CV_8S:

color_bits = 8;

break;

case CV_16U:

case CV_16S:

color_bits = 16;

break;

case CV_32S:

case CV_32F:

color_bits = 32;

break;

case CV_64F:

color_bits = 64;

break;

default:

// 处理不支持的颜色位数

break;

}

int pixel_bytes = img.elemSize(); // 获取每个像素占用的字节数

int channels = img.channels(); // 获取图像的通道数

int bit_depth = color_bits * channels * pixel_bytes; // 计算图像的颜色位数

其中,depth()方法返回的枚举类型的值,表示的意义如下:

CV_8U: 8位无符号整数CV_8S: 8位有符号整数CV_16U: 16位无符号整数CV_16S: 16位有符号整数CV_32S: 32位有符号整数CV_32F: 32位浮点数CV_64F: 64位浮点数

相关文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: