实践出真知。
问题一:图片显示为纯白或者纯黑。
为了减少维度带来的不便,我这里以灰度(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 操作的 列排 属性, 很简单,但也需要小心。