1 前言
还是想念Java,希望Java能吸收Python的特性,变得更加强大!
2 问题描述
今天在用NumPy库处理图像数据时,出现一个问题,任务是需要写一个中值滤波的算法,算法其实不是很难,不过写完之后图片总是空白的,我还以为是我算法写错了,(不过的确代码存在Bug),对图像进行中值滤波之后,滤波后的图像就变成了一偏空白,我也不知道是怎么回事;后来对代码进行调试,发现,使用“img_Padding[mStart:mStart+m, nStart:nStart+n] = img”赋值之后,img_Padding数据再显示出来,就变成一片空白了,这是为什么呢?
3 解决方案
这里面的原因比较复杂,主要原因是跟Python的特性相关,通过调试我们可以发现,img二维数组的数据类型一直是numpy.uint8类型,而经过“img_Padding[mStart:mStart+m, nStart:nStart+n] = img”赋值语句之后,img_Padding却显示是numpy.float64类型,那到底是哪里出了问题了呢?
问题就在于,我在初始化img_Padding的时候,使用的是np.zeros()函数,而np.zeros()函数在默认情况下(即没有显式设置数据类型的情况下),创建的是float类型的数组,所以这才导致img_Padding是numpy.float64类型。这种情况可以通过函数来进行数据类型的转换,代码如下:
img = np.array(img).astype('uint8')
但这其实不是最好的解决方案,最好的解决方式是在初始化img_Padding时,使用np.zeros_like()函数。