Мне удалось отфильтровать некоторые нежелательные шумные контуры, но я все еще столкнулся с проблемой: некоторые контуры, расположенные слишком близко друг к другу по оси 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}")
Что мне нужно:
Любые предложения о том, как это сделать правильно сгруппировать эти близкие контуры в один счетчик?
Есть ли более эффективный способ справиться с этим в OpenCV, возможно, используя определенные функции или методы для группировки контуров, которые являются частью одной линии?
Подробнее здесь: https://stackoverflow.com/questions/788 ... encv-pytho