在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位浮点数 相关文章
发表评论