Альтернативные методы сегментации, кроме водораздела для частиц почвы на изображениях - PullRequest
7 голосов
/ 21 февраля 2020

Я ищу альтернативный способ сегментирования зерен на следующем изображении зерен почвы, отличных от сегментации водораздела в python, так как это может ввести в заблуждение правильное обнаружение зерен, кроме того, я работаю над изображением обнаружения краев ( с использованием алгоритма HED) в приложении. Я надеюсь найти лучший способ сегментирования зерен для дальнейшей обработки, поскольку я хотел бы получить площадь каждого многоугольника на изображении в моем проекте. Заранее спасибо, я также спрашиваю о случайном Сегментация Уокера или любой другой доступный метод.

enter image description here enter image description here

Ответы [ 2 ]

6 голосов
/ 22 февраля 2020

Вы можете попробовать использовать подключенные компоненты со статистикой, уже реализованной как cv2.connectedComponentsWithStats для выполнения маркировки компонентов. Используя ваше двоичное изображение в качестве входных данных, вот изображение ложного цвета:

enter image description here

Центроид каждого объекта можно найти в параметре centroid и других такую ​​информацию, как площадь, можно найти в переменной status, возвращаемой из cv2.connectedComponentsWithStats. Вот изображение, обозначенное площадью каждого многоугольника. Вы можете фильтровать, используя минимальную пороговую область, чтобы сохранить только большие полигоны

enter image description here

Код

import cv2
import numpy as np

# Load image, Gaussian blur, grayscale, Otsu's threshold
image = cv2.imread('2.jpg')
blur = cv2.GaussianBlur(image, (3,3), 0)
gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Perform connected component labeling
n_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(thresh, connectivity=4)

# Create false color image and color background black
colors = np.random.randint(0, 255, size=(n_labels, 3), dtype=np.uint8)
colors[0] = [0, 0, 0]  # for cosmetic reason we want the background black
false_colors = colors[labels]

# Label area of each polygon
false_colors_area = false_colors.copy()
for i, centroid in enumerate(centroids[1:], start=1):
    area = stats[i, 4]
    cv2.putText(false_colors_area, str(area), (int(centroid[0]), int(centroid[1])), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 1)

cv2.imshow('thresh', thresh)
cv2.imshow('false_colors', false_colors)
cv2.imshow('false_colors_area', false_colors_area)
cv2.waitKey()
3 голосов
/ 21 февраля 2020

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

enter image description here

Чтобы начать использовать U- Net, вы можете найти предварительно натренированную модель и нанесите ее на свои изображения и посмотрите результат.

...