есть ли быстрый способ извлечь горизонтальные, вертикальные, диагональные, антидиагональные ребра в питоне, каждый из которых должен быть отдельной матрицей Я делаю это таким образом, кажется медленным и могут возникнуть некоторые проблемы с индексом
def ImageEdges(arr):
Harr , Varr , Darr,Marr= arr*0,arr*0,arr*0,arr*0
for i in range(arr.shape[0]-1):
for j in range(arr.shape[1]-1):
Harr[i,j] = np.abs(arr[i,j] - arr[i+1,j])
Varr[i,j] = np.abs(arr[i,j] - arr[i,j+1])
Darr[i,j] = np.abs(arr[i,j] - arr[i+1,j+1])
Marr[i,j] = np.abs(arr[i,j] - arr[i+1,j-1])
return Harr,Varr, Darr,Marr
Некоторые особенности будут зависеть от того, хотите ли вы какое-либо заполнение, чтобы получить одинаковые выходные размеры для всех массивов. Скажем, вы этого не сделаете, тогда это должно помочь:
Harr = np.abs(arr[:,:-1]-arr[:,1:])
Varr = np.abs(arr[:-1,:]-arr[1:,:])
Darr = np.abs(arr[:-1,:-1]-arr[1:,1:])
Marr = np.abs(arr[:-1,1:]-arr[1:,:-1])
(Обратите внимание, что я поменял местами определения Harr
и Varr
в соответствии с соглашением, согласно которому первый индекс считается «вертикальным»)
См. https://docs.python.org/3/library/stdtypes.html#common-sequence-operations, если вы не знакомы с нотацией срезов Python.