欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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)

结果如下:
python中opencv imshow函数显示一片白色原因

python中opencv imshow函数显示一片白色原因

显示照片如下:

python中opencv imshow函数显示一片白色原因python中opencv imshow函数显示一片白色原因

上面的代码是实现对图像的小波变换,对高频去掉高频系数,最后再重构,得到的数组为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)

进行类型转换后数组为:
python中opencv imshow函数显示一片白色原因

python中opencv imshow函数显示一片白色原因

显示结果为:
python中opencv imshow函数显示一片白色原因

python中opencv imshow函数显示一片白色原因

可见现在显示正常了,因为去掉了高频系数所以变模糊了。


python中opencv imshow函数显示一片白色原因