Найти расстояние до единиц в двоичном массиве numpy в python - PullRequest
0 голосов
/ 11 января 2020

Для проекта робототехники я использовал ультразвук как зрение. Из алгоритмов обнаружения ребер я сгенерировал двоичный массив numpy. Теперь я не уверен, что является наиболее экономически эффективным способом расчета расстояния до объекта. Скажите, что я хотел рассчитать кратчайшее расстояние от одного до верхнего левого угла? Можно ли будет использовать "np.where" и "dst = numpy .linalg.norm ()"?

import numpy as np
from scipy import ndimage
from PIL import Image


Max_filtrated = np.where(result>np.amax(result)*0.8,0,result)
Band_filtrated = np.where(Max_filtrated>np.amax(Max_filtrated)*0.11, 
1,0)

####### Define connected region and remove noise ########
mask = Band_filtrated> Band_filtrated.mean()
label_im, nb_labels = ndimage.label(mask)
sizes = ndimage.sum(mask, label_im, range(nb_labels + 1))
mean_vals = ndimage.sum(im, label_im, range(1, nb_labels + 1))
mask_size = sizes < 500
remove_pixel = mask_size[label_im]
label_im[remove_pixel] = 0
Ferdig= np.where(label_im>np.amax(label_im)*0.1,1,0)
#########################################################

enter image description here

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 января 2020

Я попытался сделать это по-другому - используя то же изображение, которое я обрезал для другого ответа. На этот раз я вычисляю каждый пиксель как квадрат расстояния от начала координат, а затем делаю все черные пиксели во входном изображении непонятными для того, чтобы быть ближайшими, устанавливая их в большое число. Затем я нахожу наименьшее число в массиве.

#!/usr/bin/env python3

import sys
import numpy as np
from PIL import Image

# Open image in greyscale and make into Numpy array
im = Image.open('curve.png').convert('L')
na = np.array(im)

# Make grid where every pixel is the squared distance from origin - no need to sqrt()
# This could be done outside main loop, btw
x,y = np.indices(na.shape)
dist = x*x + y*y

# Make all black pixels inelligible to be nearest
dist[np.where(na<128)] = sys.maxsize

# Find cell with smallest value, i.e. smallest distance
resultY, resultX = np.unravel_index(dist.argmin(), dist.shape)

print(f'Coordinates: [{resultY},{resultX}]')

Пример вывода

Coordinates: [159,248]

Ключевые слова : Python, обработка изображений , ближайший белый пиксель, ближайший черный пиксель, ближайший пиксель переднего плана, ближайший пиксель фона, Numpy

0 голосов
/ 11 января 2020

Я обрезал ваше изображение следующим образом - пожалуйста, не публикуйте изображения с осями и метками, если люди должны их обработать!

enter image description here

Я тогда использовать функцию Scipy cdist(). Итак, сначала создайте список всех белых пикселей на изображении, затем вычислите расстояние от начала координат в верхнем левом углу до каждого пикселя в списке. Затем найдите минимальное значение.

#!/usr/bin/env python3

import numpy as np
from PIL import Image
from scipy.spatial.distance import cdist

# Open image in greyscale and make into Numpy array
im = Image.open('curve.png').convert('L')
na = np.array(im)

# Get coordinates of white pixels
whites = np.where(na>127)

# Get distance from [0,0] to each white pixel
distances = cdist([(0,0)],np.transpose(whites))

# Index of nearest
ind = distances.argmin()

# Distance of nearest
d = distances[0,ind]

# Coords of nearest
x, y = whites[0][ind], whites[1][ind]

print(f'distance [{x},{y}] = {d}')

Пример вывода

distance [159,248] = 294.5929394944828

Если я нарисую радиус красного круга = 294 с центром в начале координат и синим кругом в центре по этим координатам x, y:

enter image description here

Ключевые слова : Python, обработка изображения, ближайший белый пиксель, ближайший черный пиксель ближайший пиксель переднего плана, ближайший пиксель фона, Numpy, cdist ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...