Добрый день всем! В настоящее время я конвертирую проект MATLAB в Python 2.7. Я пытаюсь преобразовать строку
h = [ im(:,2:cols) zeros(rows,1) ] - [ zeros(rows,1) im(:,1:cols-1) ];
Когда я пытаюсь преобразовать его
h = np.concatenate((im[1,range(2,cols)], np.zeros((rows, 1)))) -
np.concatenate((np.zeros((rows, 1)),im[1,range(2,cols - 1)] ))
IDLE возвращает различные ошибки, такие как
ValueError: all the input arrays must have same number of dimensions
Я очень новичок в Python, и я был бы признателен, если бы вы предложили другие методы. Спасибо вам большое! Здесь функция, которую я пытаюсь преобразовать.
function [gradient, or] = canny(im, sigma, scaling, vert, horz)
xscaling = vert; yscaling = horz;
hsize = [6*sigma+1, 6*sigma+1]; % The filter size.
gaussian = fspecial('gaussian',hsize,sigma);
im = filter2(gaussian,im); % Smoothed image.
im = imresize(im, scaling, 'AntiAliasing',false);
[rows, cols] = size(im);
h = [ im(:,2:cols) zeros(rows,1) ] - [ zeros(rows,1) im(:,1:cols-1) ];
И я также попросил бы эквивалент оператора ":", который используется в основном в децибелах и массивах в Python. Есть ли эквивалент для оператора:?
Преобразованный код Python я начал:
def canny(im=None, sigma=None, scaling=None, vert=None, horz=None):
xscaling = vert
yscaling = horz
hsize = (6 * sigma + 1), (6 * sigma + 1) # The filter size.
gaussian = gauss2D(hsize, sigma)
im = filter2(gaussian, im) # Smoothed image.
print("This is im")
print(im)
print("This is hsize")
print(hsize)
print("This is scaling")
print(scaling)
#scaling = 0.4
#scaling = tuple(scaling)
im = cv2.resize(im,None, fx=scaling, fy=scaling )
[rows, cols] = np.shape(im)
Скажите, что ваши данные находятся в списке списков. Попробуй это:
a = [[2, 9, 4], [7, 5, 3], [6, 1, 8]]
im = np.array(a, dtype=float)
rows = 3
cols = 3
h = (np.hstack([im[:, 1:cols], np.zeros((rows, 1))])
- np.hstack([np.zeros((rows, 1)), im[:, :cols-1]]))
Эквивалент MATLAB horzcat (то есть [AB]
) является np.hstack, а эквивалент vertcat ([A; B]
) - np.vstack.
Индексирование массива в numpy очень близко к MATLAB, за исключением того, что индексы начинаются с 0 в numpy, а диапазон p: q означает "p-q-1".
Кроме того, порядок хранения массивов строк основным по умолчанию, и вы можете использовать столбцам заказ, если вы хотите (см это). В MATLAB массивы хранятся в порядке столбцов. Чтобы проверить Python, введите, например, np.isfortran(im)
. Если он возвращает true, массив имеет тот же порядок, что и MATLAB (порядок Fortran), в противном случае он имеет значение row-major (порядок C). Это важно, когда вы хотите оптимизировать циклы или когда вы передаете массив в процедуру C или Fortran.
В идеале, постарайтесь как можно скорее поместить все в np.array и не использовать списки (они занимают гораздо больше места, а обработка намного медленнее). Есть также некоторые причуды: например, 1.0/0.0
выдает исключение, но np.float64(1.0)/np.float64(0.0)
возвращает inf
, как в MATLAB.
Другой пример из комментариев:
d1 = [ im(2:rows,2:cols) zeros(rows-1,1); zeros(1,cols) ] - ...
[ zeros(1,cols); zeros(rows-1,1) im(1:rows-1,1:cols-1) ];
d2 = [ zeros(1,cols); im(1:rows-1,2:cols) zeros(rows-1,1); ] - ...
[ zeros(rows-1,1) im(2:rows,1:cols-1); zeros(1,cols) ];
Для этого, а не np.vstack и np.hstack, вы можете использовать np.block.
im = np.ones((10, 15))
rows, cols = im.shape
d1 = (np.block([[im[1:rows, 1:cols], np.zeros((rows-1, 1))],
[np.zeros((1, cols))]]) -
np.block([[np.zeros((1, cols))],
[np.zeros((rows-1, 1)), im[:rows-1, :cols-1]]]))
d2 = (np.block([[np.zeros((1, cols))],
[im[:rows-1, 1:cols], np.zeros((rows-1, 1))]]) -
np.block([[np.zeros((rows-1, 1)), im[1:rows, :cols-1]],
[np.zeros((1, cols))]]))
С np.zeros((Nrows, 1)) вы создаете 2D-массив, содержащий массивы Nrows 1D с 1 элементом. Затем, с im [1,2: cols], вы получаете 1D массив элементов cols-2. Вы должны изменить np.zeros((rows, 1)) на np.zeros(rows).
Более того, во втором np.concatenate, когда вы получаете subarray от "im", вы должны брать столько же элементов, сколько в первом конкатенате. Обратите внимание, что вы берете один элемент меньше: диапазон диапазона (2, cols) VS (2, cols-1).