我正在尝试使用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
请帮我解决这个问题。谢谢。
答案 0 :(得分:2)
如关于如何Pass Data to MATLAB from Python的MATLAB文档中所述,仅支持一定数量的类型。这包括标量数据类型,例如int
,float
等,以及(部分)dict
。此外,list
,set
和tuple
会自动转换为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函数。