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 操作的 列排 属性, 很简单,但也需要小心。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值