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

2021-01-15 17:04:42 浏览数 (1)

参考链接: 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)

 进行类型转换后数组为:

 显示结果为:

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

0 人点赞