Подсчет стеклянных кусков с помощью OpenCV

#python #opencv #image-processing

#python #opencv #обработка изображений

Вопрос:

Я пытаюсь подсчитать количество осколков, на которые разбился стакан, используя OpenCV (cv2 / Python).

Одним из примеров ввода является это изображение: введите описание изображения здесь

Следуя руководству, которое я нашел здесь, я определил надежный передний план и фон, а затем использовал алгоритм водораздела.

Я получил этот результат:

введите описание изображения здесь

Как вы можете видеть, решение не идеально: некоторые фрагменты разделены на две части, некоторые объединены с другими. Также длинные строки, которые следует игнорировать, иногда рассматриваются как границы.

У вас есть разные идеи для методов, которые я мог бы использовать? Я довольно новичок в OpenCV.

Спасибо! 🙂


РЕДАКТИРОВАТЬ: вот мой код, потому что об этом просили комментаторы. Как я уже сказал, он следует по опубликованной ссылке.

 import cv2
import matplotlib.pyplot as plt
import numpy as np
import sys
%matplotlib inline

# Default show images in greyscale
plt.gray()

img = cv2.imread('../data/raw/example.jpg',0)

# noise removal
img = cv2.GaussianBlur(img, (5, 5), 0)
ret, thresh = cv2.threshold(img,0,255,cv2.THRESH_OTSU)
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2) 

# sure background area
sure_bg = cv2.dilate(opening,kernel,iterations=1)

# Finding sure foreground area
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
ret, sure_fg = cv2.threshold(dist_transform,0.4*dist_transform.max(),255,0)

# Finding unknown region
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)

# Marker labelling
ret, markers = cv2.connectedComponents(sure_fg)

# Add one to all labels so that sure background is not 0, but 1
markers = markers 1

# Now, mark the region of unknown with zero
markers[unknown==255] = 0

# Watershed
img_color = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
markers = cv2.watershed(img_color,markers)
img_color[markers == -1] = [255,0,0]

def plot_image(image, figsize=(18,18)):
    fig, ax = plt.subplots(figsize=(18, 20))
    ax.imshow(image, cmap='gray')
    plt.show()

plot_image(img_color)
 

Комментарии:

1. изучите способы использования оптики. осветите так, чтобы выделялись трещины.

2. Пожалуйста, опубликуйте свой код.