Как найти диаметр входных изображений объектов с помощью обработки изображений в Python?

1

Учитывая входное изображение, например, jpg с некоторыми круговыми объектами (например, монеты), я хочу найти их индивидуальные диаметры.

Благодаря этому вопросу (как найти диаметр объектов с использованием обработки изображений в Python?) , Я знаю, как идентифицировать объекты, но я хотел измерить диаметр вставленных мной изображений и не генерировать случайным образом с помощью методов. Как мне это сделать?

import numpy as np
from scipy import ndimage
from matplotlib import pyplot as plt

# generate some lowpass-filtered noise as a test image
gen = np.random.RandomState(0)
img = gen.poisson(2, size=(512, 512))  
img = ndimage.gaussian_filter(img.astype(np.double), (30, 30))
img -= img.min()
img /= img.max()

# use a boolean condition to find where pixel values are > 0.75
blobs = img > 0.75

# label connected regions that satisfy this condition
labels, nlabels = ndimage.label(blobs)

# find their centres of mass. in this case I'm weighting by the pixel values in
# 'img', but you could also pass the boolean values in 'blobs' to compute the
# unweighted centroids.
r, c = np.vstack(ndimage.center_of_mass(img, labels, np.arange(nlabels) + 1)).T

# find their distances from the top-left corner
d = np.sqrt(r*r + c*c)

# plot
fig, ax = plt.subplots(1, 2, sharex=True, sharey=True, figsize=(10, 5))
ax[0].imshow(img)
ax[1].hold(True)
ax[1].imshow(np.ma.masked_array(labels, ~blobs), cmap=plt.cm.rainbow)
for ri, ci, di in zip(r, c, d):
    ax[1].annotate('', xy=(0, 0), xytext=(ci, ri),
               arrowprops={'arrowstyle':'<-', 'shrinkA':0})
    ax[1].annotate('d=%.1f' % di, xy=(ci, ri),  xytext=(0, -5),
               textcoords='offset points', ha='center', va='top',
               fontsize='x-large')
for aa in ax.flat:
    aa.set_axis_off()
fig.tight_layout()
plt.show()

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

  • 0
    Вы немного перешли на испанский в вопросе, не могли бы вы задать полный вопрос на английском? Я верю, что суть вашего вопроса там, но я не понимаю этого. Спасибо.
  • 0
    Вы ищете алгоритм обнаружения BLOB-объектов. Посмотрите пример обнаружения BLOB- объектов в пакете scikit-image .
Показать ещё 2 комментария
Теги:
image-processing
numpy
geometry
ndimage

2 ответа

0

Вы можете использовать OpenCV2-функцию cv2.connectedComponentsWithStats(blobs) Эти функции возвращают самую левую (x) координату, которая является включенным началом ограничивающей рамки в горизонтальном направлении. Самая верхняя (y) координата, которая является включенным началом ограничивающий прямоугольник в вертикальном направлении, горизонтальный размер ограничивающего прямоугольника, вертикальный размер ограничивающей рамки, общая площадь (в пикселях) подключенного компонента. Чтобы использовать эту функцию, вам нужно преобразовать blobs.dtype='uint8', В области и предполагая совершенно круглый объект, вы можете рассчитать диаметр или использовать размеры ограничительной рамки, как было предложено.

0

Простое приближение может состоять в том, чтобы предполагать идеальные круговые объекты, тогда радиус является квадратным корнем из области (то есть числом пикселей), деленной на pi:

def radius(A):
    return np.sqrt( A/np.pi )

def max_bounding_box(labels, k):
    idx, idy = np.where( labels==k )
    Sx = max(idx) - min(idx)
    Sy = max(idy) - min(idy)
    return max(Sx, Sy)/2

for k in range(1, nlabels):
    A = len( np.nonzero( labels==k )[0] )
    print(k, radius(A), max_bounding_box(labels, k)


1 41.32472068116174 52.5
2 31.040683392579073 37.0
3 34.37391885593249 39.0
4 26.986904594423443 27.5
5 73.79677393164606 80.0
6 15.012108426804138 17.0

В противном случае радиус недостаточно определен: размер ограничивающей рамки?, дуга, имеющая максимальную длину?

edit: Я добавил оценку наибольшего размера ограничивающей рамки

Ещё вопросы

Сообщество Overcoder
Наверх
Меню