当前位置:网站首页>【OpenCV】 - 显示图像API之imshow()对不同位深度(数据类型)的图像的处理方法
【OpenCV】 - 显示图像API之imshow()对不同位深度(数据类型)的图像的处理方法
2022-08-03 06:24:00 【键盘即钢琴】
参考文章
本篇是对下面这篇「田土豆」写的文章的补充和修正。
有关函数cv2.imshow()处理不同图像深度时的数据转化问题_田土豆的博客
另外也参考了官方API文档
OpenCV: High-level GUI-imshow()
一、imshow(windows_name, img_array)
显示图像的函数,第二个参数img代表了图像多维数组。
当图像多维数组是不同的数据类型,或者说图像是不同的位深度时,最后imshow处理的机制不同。
二、支持显示的图像有哪些位深度?
- CV_8U,在0-255之间
- CV_16U,在0-65535之间
- CV_32F,单精度浮点
- CV_64F,双精度浮点
经测试,在OpenCV的4.5.5版本(不代表是最早不支持的版本)中,不支持CV_32S和CV_16F两种位深度图像。
三、对各个位深度的处理方式?
官方文档的描述如下
- If the image is 8-bit unsigned, it is displayed as is.
- 如果图像是无符号八位整型,是多少数字就最后显示多少;换句话说,imshow()显示图像的精度范围是在0-255之间,正好对应无符号整型。
- If the image is 16-bit unsigned, the pixels are divided by 256. That is, the value range [0,255*256] is mapped to [0,255].
- 如果是16位无符号整型,那么由于范围是0-65535,需要将每个像素点除以255得到范围是0-255的深度,而后再显示。
- If the image is 32-bit or 64-bit floating-point, the pixel values are multiplied by 255. That is, the value range [0,1] is mapped to [0,255].
- 如果是32位或64位浮点型,那么因为这个位深度的图像——各像素点的正常取值范围在0-1,像素点需要先乘以255再显示。
- 32-bit integer images are not processed anymore due to ambiguouty of required transform. Convert to 8-bit unsigned matrix using a custom preprocessing specific to image's context.
- 32位(有)符号整型不再加工(显示)由于必要转换的模糊性;因此如果实在要显示32S的图像,先用自定义预处理程序转换至无符号8位整型,才能顺利显示。
田大哥的文章中额外提到一个观点——如果浮点型多维数组有元素取值是负数,那么先取绝对值后再乘以255,最后按255截断。
我在测试他的最后一块代码时,发现并非如此。
我的OpenCV版本是4.5.5,他写文章时用的是4.1.0,兴许是版本更替所致吧!
在4.5.5版本中,不管浮点型多维数组有无负数,都是直接乘以255,得到的数然后进行0-255的饱和运算,也即如果小于0就等于0,如果大于255就等于255。
四、代码测试
在Python中运行下列代码
import numpy as np
import cv2
#新建numpy数组,注意np.zero()创建的数据类型为float64
img=np.zeros((500,500,3))
#openCV显示图像为BGR格式,通过下列方式,我们绘制三条粗红线
print(cv2.__version__)
img[150:170,150:350]=[0,0,-8000]
img[250:270,150:350]=[0,0,8000]
img[350:370,150:350]=[0,0,0.34]
img[450:470,150:350]=[0,0,65555]
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()显示的图像如下。因为第一条对应的像素点原值是负数,所以最后饱和运算取值为0,显示成黑色;因为saturate_8U(0.34*255)=86.7,小于saturate_8U(8000*255)=255,所以第三条显示的颜色明显更浅!而由于第四条和第二条对应的像素点都是正整数,所以最后颜色深度相同。

边栏推荐
- el-table gets the data attribute of a row in the read data table
- pyspark --- count the mode of multiple columns and return it at once
- MySQL的DATE_FORMAT()函数将Date转为字符串
- 第五章:指令集
- 924. 尽量减少恶意软件的传播 前缀和
- 编程语言有什么
- empty() received an invalid combination of arguments - got (tuple, dtype=NoneType, device=NoneType),
- 关于NOI 2022福建省选及省队组成的公告
- Flutter | 判断 Text 组件是否显示完
- 在线开启gtid偶发hang住的问题解决
猜你喜欢
随机推荐
第六章:存储系统
6.nodejs--promise、async-await
Basic syntax of MySQL DDL and DML and DQL
MySQL的Replace用法详解
Charles抓包显示<unknown>解决方案
El - tree to set focus on selected highlight highlighting, the selected node deepen background and change the font color, etc
el-tree设置利用setCheckedNodessetCheckedKeys默认勾选节点,以及通过setChecked新增勾选指定节点
Shell脚本之一键安装mysql
贷中存量客户的价值挖掘与分类实现,试试这一重要的场景模型
QT信号与槽
死锁的成因和对应的解决方案
(十五)51单片机——呼吸灯与直流电机调速(PWM)
【着色器实现Glow可控局部发光效果_Shader效果第十三篇】
Flutter | 判断 Text 组件是否显示完
分布式数据库数据一致性的原理、与技术实现方案
MySQL 操作语句大全(详细)
关于NOI 2022福建省选及省队组成的公告
阿里云-武林头条-建站小能手争霸赛
Docker-compose安装mysql
MySQL的on duplicate key update 的使用









