参考链接: Python OpenCV 基础 0: imshow 显示图像
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_test13.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_test13.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)
进行类型转换后数组为:
显示结果为:
可见现在显示正常了,因为去掉了高频系数所以变模糊了。