Как удалить контуры, расположенные слишком близко друг к другу по осям X OPENCV — PYTHONPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как удалить контуры, расположенные слишком близко друг к другу по осям X OPENCV — PYTHON

Сообщение Anonymous »

Я работаю над проектом обработки изображений с использованием OpenCV на Python. Моя цель — подсчитать количество строк в стеке, чтобы определить общее количество элементов в стеке.
Мне удалось отфильтровать некоторые нежелательные шумные контуры, но я все еще столкнулся с проблемой: некоторые контуры, расположенные слишком близко друг к другу по оси X, считаются отдельно, хотя должны считаться как одна линия. По сути, контуры, являющиеся частью одной линии, разбиваются на несколько частей.
Будем очень признательны за любую помощь или рекомендации!
Конечное изображение что я получаю

Код: Выделить всё

def process(image, x, y, w, h):

image_height, image_width, _ = image.shape

# Check if the ROI is within the image bounds
if x + w > image_width or y + h > image_height:
raise ValueError("ROI is out of image bounds.")

# Define the height of each part
part_height = h // 5

def filter_contours_by_x_y_range(contours, min_distance, min_area):
filtered_contours = []
for contour in contours:
x_contour, y_contour, w_contour, h_contour = cv2.boundingRect(contour)
# Check if this contour is close to any existing filtered contour in y-axis
close_to_existing = False
for filtered_contour in filtered_contours:
x_filt, y_filt, _, _ = cv2.boundingRect(filtered_contour)
if abs(y_filt - y_contour) < min_distance:
close_to_existing = True
break
if not close_to_existing and cv2.contourArea(contour) >= min_area:
filtered_contours.append(contour)
return filtered_contours

def filter_contours_by_x_range(contours, x_min, x_max, min_area):
filtered_contours = []
for contour in contours:
x_contour, y_contour, w_contour, h_contour = cv2.boundingRect(contour)
if x_min  image_height:
raise ValueError(f"Part {i+1} ROI is out of image bounds.")

# Extract and preprocess the part of the ROI
part_roi = image[part_y:part_y+part_height, x:x+w]

gray = cv2.cvtColor(part_roi, cv2.COLOR_BGR2GRAY)

blurred = cv2.GaussianBlur(gray, (1, 1), 0)

# Apply thresholding
_, thresholded = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY)

# Find contours
contours, _ = cv2.findContours(thresholded, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

x_min = 55
x_max = 70
min_area = 1
min_distance = 3

filtered_contours = filter_contours_by_x_range(contours, x_min, x_max, min_area)
filtered_contours = filter_contours_by_x_y_range(filtered_contours, min_distance, min_area)

# Count the number of filtered contours
ring_count = len(filtered_contours)
ring_counts.append(ring_count)

part_roi_contours = part_roi.copy()
cv2.drawContours(part_roi_contours, filtered_contours, -1, (0, 255, 0), 2)
part_roi_rgb = cv2.cvtColor(part_roi_contours, cv2.COLOR_BGR2RGB)

cv2.imshow(f"Contours in Part {i+1}", part_roi_contours)
while True:
key = cv2.waitKey(0) & 0xFF
if key == ord('q'):
break
cv2.destroyAllWindows()

# Print the counts for each part
for i, count in enumerate(ring_counts):
print(f"Number of rings in Part {i+1}: {count}")
Я создал функцию, которая проверяет расположение контуров по оси X и удаляет те, которые расположены слишком близко друг к другу. Я по-прежнему получаю неправильные подсчеты, когда соседние контуры считаются отдельными линиями.
Что мне нужно:
Любые предложения о том, как это сделать правильно сгруппировать эти близкие контуры в один счетчик?
Есть ли более эффективный способ справиться с этим в OpenCV, возможно, используя определенные функции или методы для группировки контуров, которые являются частью одной линии?

Подробнее здесь: https://stackoverflow.com/questions/788 ... encv-pytho
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»