imshow显示图像为纯白或者纯黑或者为杂点(noise)原因分析(下篇)

实践出真知。

 

问题一:图片显示为纯白或者纯黑。

 

为了减少维度带来的不便,我这里以灰度(gray image)作示例,原理是一样的。

示例:

 执行  img1 = imread('a1.jpg'), 在工作区可以看到读进来的格式为,注意这里是 unit8格式,就是 unsigned int 8,就是无符号整形并且用8位表示,数值范围从0~255,点开img1查看也正是如此,如下图:

 

然后我现在执行: img2 = double(img1),将unit8数据类型改变为double,然后imshow(img2),显示如下

                                                              

显示一片白的.然后我令  img3 = double(img)/255 ,用imshow()又可以显示了,如下图:   为什么会这样?

                                                               

原因和解决办法: imread()在读取double数据类型的图像时,默认其值范围是 0~1,如果大于1,就默认显示为白色,所以没有归一化的 img2 = double(img1) 显示为白色, 归一化的 img3 = double(img)/255 正常显示。(附:灰度图中 0表示黑色,255表示白色)因此,要用imshow显示double数据类型的图片,记得要保持数据在0~1之间,或者转换成unit8类型的数据,就可以直接显示了。(当然,这里可能会丢失精度。)

 

 

问题二:imshow()显示图像为杂点(噪音)

问题描述imshow()出来的图片又颜色灰度的不同,但是杂乱无章,没有空间结构,整体看起来是一幅噪音图。

思考:有灰度等级的不同,不是纯白或者纯黑,说明不是问题一的原因导致的,但是显示的很杂乱,思考会不会是读取的时候

数据排列的方式出了问题?

实践出真知:

问题复现,还是读入一幅图,如下: width = 92(图片的宽),height = 112(图片的高

 

 

然后我分别用reshape() 函数把它112x92的人脸图变换成如下维度:

,第一个用列向量表示,第二个用行向量表示。

然后在reshape回92*112,直观上的理解是人脸会发生一个旋转,因为是112*92变成了92*112,也就是转置了一下,但是最后imshow(),结果如下图:人脸变成了噪声图,失去了空间结构信息,为什么?  我想你大概知道了

原因:举个简单的例子

A = [1,2,3; 4,5,6] 是一个 2x3行的matrix,如下图

 

row_vector = reshape(A,1,[ ]) 后得到  row_vector = [1,2,3,4,5,6],如下图

 注意:排列方式为把列拉成行排

 

column_vector = reshape(A,[ ],1)后得到 column_vector 为下图

  注意:排列方式为列排

 

现在我要把列向量拉成 3*2 的,然后转置,试图恢复原来的人脸图矩阵, img1 = reshape(column_vector,3,2)  得到 

   转置后     ,然后原来的“人脸矩阵”是,所以显示的是没有空间结构的噪点。

 

 

注意matlab reshape 操作的 列排 属性, 很简单,但也需要小心。

 

 

 

 

 

 

### 解决 `plt.imshow` 图像显示问题 当遇到 `plt.imshow()` 函数无法正常显示图像的情况时,可能的原因有多种。以下是几种常见情况及其对应的解决方案: #### 1. Matplotlib 库未正确安装 如果 Matplotlib 没有被正确安装,则可能导致 `plt.imshow()` 功能失效。确保已经成功安装了该库[^1]。 ```bash pip install matplotlib ``` #### 2. 缺少图形界面支持 某些环境下,默认的 Matplotlib 后端可能不适合当前的操作系统或环境配置。尝试设置不同的后端来解决问题: ```python import matplotlib matplotlib.use('TkAgg') # 或者 'Qt5Agg', 'WXAgg' 等其他选项 import matplotlib.pyplot as plt ``` #### 3. 使用 Jupyter Notebook 时不自动刷新绘图窗口 对于交互式的开发环境如Jupyter Notebook, 需要显式地调用 `plt.show()` 方法才能看到绘制的结果;另外也可以启用内联模式以便即时查看图表变化。 ```python %matplotlib inline # 或者使用 %matplotlib notebook 实现更灵活的互动体验 ``` #### 4. OpenCV 和 Matplotlib 色彩空间差异引起的问题 由于 OpenCV 默认采用 BGR 格式存储像素数据,而 Matplotlib 则期望接收 RGB 数据作为输入参数。因此,在将由 cv2.imread 加载得到的数据传递给 `plt.imshow()` 前需转换色彩通道顺序[^4]: ```python import cv2 from matplotlib import pyplot as plt img_bgr = cv2.imread('image_path') img_rgb = img_bgr[:, :, ::-1] # 将BGR转为RGB plt.imshow(img_rgb) plt.axis('off') # 可选:关闭坐标轴刻度线 plt.show() ``` 以上措施通常可以有效解决大部分情况下 `plt.imshow()` 不显示图像问题。若仍然存在异常状况,请进一步排查具体的应用场景并调整相应设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值