在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() " <<typeid(src2.size()).name()<< std::endl;
std::cout << "hsv.channels() " <<src2.channels()<< std::endl;
std::cout << "hsv.type() " <<src2.type()<< std::endl;
std::cout <<"hsv.size() " << src2.size()<< std::endl;
输出:
typeid(hsv.size()).name() class cv::Size_<int>
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获取颜色位数呢?文章来源:https://www.toymoban.com/news/detail-741446.html
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()
方法返回的枚举类型的值,表示的意义如下:文章来源地址https://www.toymoban.com/news/detail-741446.html
-
CV_8U
: 8位无符号整数 -
CV_8S
: 8位有符号整数 -
CV_16U
: 16位无符号整数 -
CV_16S
: 16位有符号整数 -
CV_32S
: 32位有符号整数 -
CV_32F
: 32位浮点数 -
CV_64F
: 64位浮点数
到了这里,关于opencv读取32位/16位颜色图像的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!