2016-04-08 7 views
1

Я вручную конвертирую код MATLAB в Python, и я застрял в одной строке.MATLAB to Python Code Conversion - imclose() issue

код MATLAB:

cashew_BW = threshad(cashew_GRAY(:,:,1),T); 
cashew_BW = ~cashew_BW; 
cashew_BW = imclose(cashew_BW, true(5)); 
cashew_BW = ~cashew_BW 

Python конвертированы код:

T = 112 
se = [[1,1,1,1,1]]*5 
cashew_BW = pymorph.threshad(cashew_GRAY, T, f2=None) 
cashew_BW = np.logical_not(cashew_BW) 
cashew_BW = 1*(cashew_BW) 
cashew_BW = pymorph.close(cashew_BW, se) 
cashew_BW = np.logical_not(cashew_BW) 
cashew_BW = 1*(cashew_BW) 

Ошибка:

Traceback (most recent call last): 
    File "check1.py", line 22, in <module> 
    cashew_BW = pymorph.close(cashew_BW, se) 
    File "/home/keerthi/anaconda2/lib/python2.7/site-packages/pymorph-0.96-py2.7.egg/pymorph/mmorph.py", line 1303, in close 
    return erode(dilate(f,Bc),Bc) 
    File "/home/keerthi/anaconda2/lib/python2.7/site-packages/pymorph-0.96-py2.7.egg/pymorph/mmorph.py", line 1580, in dilate 
    x,v = mat2set(B) 
    File "/home/keerthi/anaconda2/lib/python2.7/site-packages/pymorph-0.96-py2.7.egg/pymorph/mmorph.py", line 4392, in mat2set 
    if len(A.shape) == 1: A = A[newaxis,:] 
AttributeError: 'list' object has no attribute 'shape' 

Как это исправить?

ответ

0

Способ работы матриц в MATLAB аналогичен массивам numpy, но списки python различны. Исходя из MATLAB, это не очевидно, поэтому я бы предложил немного почитать о списках python. Например, линия

se = [[1,1,1,1,1]]*5 

не вернется [5,5,5,5,5], но вместо этого создает

[[1, 1, 1, 1, 1], 
[1, 1, 1, 1, 1], 
[1, 1, 1, 1, 1], 
[1, 1, 1, 1, 1], 
[1, 1, 1, 1, 1]] 

поведение по умолчанию со списком питона, чтобы создать 5 раз список. Ошибка, которую вы видите, потому что вы проходите se, список python (len(a), чтобы получить размер), когда pymorph.close ожидает numpy array (a.shape для получения формы/размера). Вы всегда должны преобразовать в Numpy массивы, чтобы получить согласованное поведение с MATLAB, в вашем случае,

se = 5*np.array([1,1,1,1,1]) 

даст [5,5,5,5,5] и должны избегать ошибок в pymorph.close, как таковой имеет тип Numpy массива.

+0

Я использовал только np.array ([1,1,1,1,1]), чтобы проверить, и у меня есть ошибка: 'слишком много индексов для массива' –

+0

Я предполагаю, что ошибка возникает после прохождения' se' в 'pymorph .close'? Из документов это должно быть форма '{3x3 cross}', поэтому, возможно, попробуйте что-то вроде 'se = pymorph.secross (r = 1)', чтобы узнать, работает ли это ... –