这个八度代码的等效python代码是什么

时间:2016-04-03 06:29:59

标签: python-2.7 octave

link to code and files

1.I =imread('one.jpg');

2.I = inresize(I,[20,20]);
3.I=im2double(I);
4.I=mean(I,3);
#This next line
5.a = reshape(I,[],400);

我读了一张图像并将其缩小为20 * 20,然后将其转换为矩阵然后找到灰度。所有这些我也可以在Python中完成....但我不能做第5行代码...如果我试过, 重塑(I,1,400)...图像显示为旋转...我不知道如何在python中编写如上所述的行

问题

在链接中以及代码theres是一个displayData函数。我保存了我使用python作为mat的矩阵并将其加载到octave上当我在矩阵上调用displayData()时我得到了一个旋转的图像。包括在在八度音阶中没有这样的问题。谢谢你对此进行调查。

1 个答案:

答案 0 :(得分:1)

要重新塑造数组,您可以使用numpy,然后按照代码使用reshape。在你的情况下,你正在改变I的大小,从(20,20)到(1,400)。 使用OpenCV API处理图像,将生成的重新整形数组保存到mat文件的完整示例是:

import numpy as np
import cv2
import scipy.io

I = cv2.imread('one.jpg')
I = cv2.resize(I,(20,20))
I = cv2.normalize(I.astype('float'), None, 0.0, 1.0, cv2.NORM_MINMAX)
I = np.mean(I, axis=2)
a = np.reshape(I, (1,400), order='F')
scipy.io.savemat('a.mat', mdict={'a': a})

注意reshape的第二个参数,它是一个包含数组新大小的元组。另外,请注意第三个参数order,它允许重新排列列主要样式(Fortran)中的元素,这是octave使用的约定(请参阅八度音阶http://www.gnu.org/software/octave/doc/v4.0.1/Rearranging-Matrices.html#XREFreshape中的重新整形)。与从八度音阶得到的图像相比,这样可以得到正确的图像,不旋转。

但是,考虑到你想从2d数组获得1d数组,你可以使用numpy ravel来获取I(如果可能)的视图,即修改a的变化也I;或flatten,返回I的副本,因此修改a不会更改I。但请注意,ravelflatten都返回1d数组,结果大小为(400,)。应该使用相同的order参数。