将图像从Python传递到MATLAB函数

时间:2017-04-24 11:47:19

标签: python matlab image-processing python-imaging-library

我正在尝试使用MATLAB Python引擎在Python中使用MATLAB函数。 MATLAB函数用于处理图像。这是我的代码:

import matlab.engine
import os
from PIL import Image

img_rows, img_cols = 256, 256
img_channels = 1

path0 = r'D:\NEW PICS\non_stressed'
path2 = r'D:\empty2'

listing = os.listdir(path0) 
num_samples=size(listing)
print (num_samples)
eng = matlab.engine.start_matlab()

for file in listing:
    im = Image.open(path0 + '\\' + file)   
    img = im.resize((img_rows,img_cols))
    gray = img.convert('L')

    #gray: This is the image I want to pass from Python to MATLAB
    reg = eng.LBP(gray)   
    reg.save(path2 +'\\' +  file, "JPEG")

但它给了我这个错误:

  

TypeError:不支持的Python数据类型:PIL.Image.Image

请帮我解决这个问题。谢谢。

1 个答案:

答案 0 :(得分:2)

如关于如何Pass Data to MATLAB from Python的MATLAB文档中所述,仅支持一定数量的类型。这包括标量数据类型,例如intfloat等,以及(部分)dict。此外,listsettuple会自动转换为MATLAB单元格数组。

但是:array.array,并且任何module.type个对象都不支持 。这包括PIL.Image.Image,就像您的情况一样。在将图像传递给MATLAB之前,您必须将图像转换为支持的数据类型。

对于数组,MATLAB建议对Python使用特殊的MATLAB Array type。您可以将PIL图像转换为例如带{/ 1>的MATLAB数组

uint8

最后from PIL import Image import matlab.engine image = Image.new('RGB', (1024, 1280)) image_mat = matlab.uint8(list(image.getdata())) image_mat.reshape((image.size[0], image.size[1], 3)) 命令是必需的,因为PIL的reshape函数会返回一个展平的像素值列表,因此图像的宽度和高度会丢失。现在,您可以在getdata()数组上调用任何MATLAB函数。