opencv读取32位/16位颜色图像

这篇具有很好参考价值的文章主要介绍了opencv读取32位/16位颜色图像。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在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获取颜色位数呢?

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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包