python中opencv imshow函数显示一片白色原因
程序员文章站
2022-05-20 22:09:39
...
imshow
显示类型
首先应当明确的是,opencv中imshow内部的参数类型可以分为两种。(1)当输入矩阵是uint8类型的时候,此时imshow显示图像的时候,会认为输入矩阵的范围在0-255之间。(2)如果imshow的参数是double类型的时候,那么imshow会认为输入矩阵的范围在0-1。
显示出现问题原因:
用OpenCV中imread输入照片后是一个数组对象,在进行一系列的对数组操作后数组已经变成了float类型,之后再对数组进行imshow时即出现上面的第二种情况。倘若图像矩阵(double型)的矩阵元素不在0-1之间,那么imshow会把超过1的元素都显示为白色,即255。其实也好理解,因为double的矩阵并不是归一化后的矩阵并不能保证元素范围一定就在0-1之间,所以就会出错。
解决的办法:
用numpy.astype()对数组类型进行转换。
import numpy as np
a=np.array([1.11,2.22,3.33]) #数据类型转换用astype,数组长度不会变
a=a.astype(np.int8)
print(a)
[1 2 3]
再来看看实例:
import pywt import numpy as np import matplotlib.pyplot as plt import cv2 img=cv2.imread(r'F:\picture_test\13.jpg') img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) img=cv2.resize(img,(512,512)) coefs=pywt.wavedec2(img, 'db6',level=2) coefs[1]=np.zeros_like(coefs[1]) coefs[2]=np.zeros_like(coefs[2]) con_img=pywt.waverec2(coefs,'db6') print(con_img.dtype.type) print('con_img',con_img) cv2.imshow('con_img=',con_img) cv2.waitKey(0)
结果如下:
显示照片如下:
上面的代码是实现对图像的小波变换,对高频去掉高频系数,最后再重构,得到的数组为float类型。
现在进行类型转换。
import pywt import numpy as np import matplotlib.pyplot as plt import cv2 img=cv2.imread(r'F:\picture_test\13.jpg') img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) img=cv2.resize(img,(512,512)) coefs=pywt.wavedec2(img, 'db6',level=2) coefs[1]=np.zeros_like(coefs[1]) coefs[2]=np.zeros_like(coefs[2]) con_img=pywt.waverec2(coefs,'db6') con_img=con_img.astype(np.uint8) #进行类型转换 print(con_img.dtype.type) print('con_img',con_img) cv2.imshow('con_img=',con_img) cv2.waitKey(0)
进行类型转换后数组为:
显示结果为:
可见现在显示正常了,因为去掉了高频系数所以变模糊了。