Я работаю над проектом обработки изображений с использованием 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, возможно, используя определенные функции или методы для группировки контуров, которые являются частью одной линии?
Я работаю над проектом обработки изображений с использованием OpenCV на Python. Моя цель — подсчитать количество строк в стеке, чтобы определить общее количество элементов в стеке. Мне удалось отфильтровать некоторые нежелательные шумные контуры, но я все еще столкнулся с проблемой: некоторые контуры, расположенные слишком близко друг к другу по оси X, считаются отдельно, хотя должны считаться как одна линия. По сути, контуры, являющиеся частью одной линии, разбиваются на несколько частей. Будем очень признательны за любую помощь или рекомендации! Конечное изображение что я получаю [code]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]
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}") [/code] Я создал функцию, которая проверяет расположение контуров по оси X и удаляет те, которые расположены слишком близко друг к другу. Я по-прежнему получаю неправильные подсчеты, когда соседние контуры считаются отдельными линиями. Что мне нужно: Любые предложения о том, как это сделать правильно сгруппировать эти близкие контуры в один счетчик? Есть ли более эффективный способ справиться с этим в OpenCV, возможно, используя определенные функции или методы для группировки контуров, которые являются частью одной линии?
У меня есть списки Python, как показано ниже:
x1 =
или
x2 =
Как видно в обоих списках повторяющиеся значения появляются в разных формах, например:
в списке 1:
'aida-reporting-service' и 'porting-service'
'harbour-service' и...
У меня есть списки Python, как показано ниже:
x1 =
или
x2 =
Как видно в обоих списках повторяющиеся значения появляются в разных формах, например:
в списке 1:
'xyz-reporting-service' и 'porting-service'
'harbour-service' и...
У меня есть списки Python, как показано ниже:
x1 =
или
x2 =
Как видно в обоих списках повторяющиеся значения появляются в разных формах, например:
в списке 1:
'xyz-reporting-service' и 'porting-service'
'harbour-service' и...
У меня есть растровое изображение, где я пытаюсь удалить контуры, которые касаются границы изображения, которые являются короткими, которые не являются прямыми или круглыми. Тем не менее, я не смог удалить линии, которые почти прямые. Я подумал, что...