Все объекты расположены под одинаковым углом относительно точки зрения. По сути задача сводится к выявлению и сопоставлению соответствующих 2D-образцов.
Я хочу сделать это без глубокого обучения, используя традиционные методы или алгоритмы компьютерного зрения.

До сих пор я пробовал извлекать контуры с помощью Коварно, но результаты шумные, и Я не знаю, как их улучшить.
Код: Выделить всё
import cv2
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
image = np.array(image)
bil = cv2.bilateralFilter(image, d=2, sigmaColor=75, sigmaSpace=300)
edges = cv2.Canny(bil, 0, 20)
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
min_length = 25
filtered_contours = [cnt for cnt in contours if cv2.arcLength(cnt, True) >= min_length]
filtered_edge_image = np.zeros_like(edges)
cv2.drawContours(filtered_edge_image, filtered_contours, -1, (255, 255, 255), 1)
image = Image.fromarray(filtered_edge_image.astype(np.uint8))
image

I также рассчитал величину градиента, которая кажется ближе к тому, что мне нужно, но я не могу понять, как полностью заполнить маски нужных поверхностей белым цветом, не включая другие поверхности.
Код: Выделить всё
import cv2
import numpy as np
from PIL import Image
from skimage.util import invert
img = cv2.imread("img.png", cv2.IMREAD_GRAYSCALE)
image = invert(img)
sobelx = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
sobely = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)
magnitude = np.sqrt(sobelx**2 + sobely**2)
magnitude = np.uint8(magnitude * 255 / np.max(magnitude))
thresh = cv2.threshold(magnitude, 0, 255, cv2.THRESH_BINARY)
Image.fromarray(thresh)

В на этом этапе я застрял.
- Как мне получить точные маски сегментации?
- Как классифицировать маски одинаковых поверхностей? Стоит ли использовать аффинные преобразования?
Подробнее здесь: https://stackoverflow.com/questions/793 ... d-surfaces
Мобильная версия