РАЗРАБОТКА АЛГОРИТМА ДЛЯ ИЗМЕРЕНИЯ ДИАМЕТРА ПЯТНА КОНТАКТА НА ИЗОБРАЖЕНИЯХ
Конференция: LXXXIV Международная научно-практическая конференция «Научный форум: инновационная наука»
Секция: Технические науки

LXXXIV Международная научно-практическая конференция «Научный форум: инновационная наука»
РАЗРАБОТКА АЛГОРИТМА ДЛЯ ИЗМЕРЕНИЯ ДИАМЕТРА ПЯТНА КОНТАКТА НА ИЗОБРАЖЕНИЯХ
Аннотация. В статье представлен адаптивный алгоритм обработки изображений для измерения диаметра пятна контакта. Разработан метод, использующий настраиваемые пороговые значения для анализа нечетких изображений, полученных с экспериментальной установки. Алгоритм реализован на python с библиотекой opencv. Результаты подтверждают возможность повышения точности измерений контактных деформаций.
Ключевые слова: контактные деформации; пятно контакта; обработка изображений; адаптивный алгоритм; пороговая бинаризация; opencv.
Контактные методы измерений остаются важным инструментом в метрологии благодаря их простоте, доступности и надежности [1]. Они широко применяются в задачах контроля геометрических параметров деталей, координатной метрологии и активного мониторинга размеров изделий в производственных процессах [4]. Однако точность таких измерений существенно ограничивается погрешностями, вызванными контактными деформациями, возникающими при взаимодействии измерительного наконечника с поверхностью объекта [2]. Эти деформации, обусловленные упругими и пластическими свойствами материалов, а также величиной измерительного усилия, могут достигать нескольких микрометров, что недопустимо для высокоточных задач, таких как контроль резьбовых параметров или интерференционных соединений [5].
Для повышения точности контактных измерений необходимо количественно оценить контактные деформации, что требует измерения размеров зоны контакта, или пятна контакта [3]. В данной работе представлена экспериментальная установка, использующая оптически прозрачный стеклянный наконечник и видеокамеру для визуализации пятна контакта. Однако получаемые изображения характеризуются размытостью границ из-за оптических искажений, неоднородного освещения и микрогеометрии поверхности, что затрудняет определение диаметра пятна контакта. Для решения этой проблемы разработан адаптивный алгоритм обработки изображений, позволяющий определять диаметр пятна контакта с учетом нечеткости и неоднородности освещения. Настоящая статья посвящена описанию этого алгоритма, его математической основы, программной реализации и результатов экспериментальных исследований.
Средства контактных измерений, такие как измерительные головки координатно-измерительных машин, щупы активного контроля размеров и приборы для контроля резьбовых параметров, взаимодействуют с поверхностью изделия посредством жестких или упругих наконечников [8]. Эти наконечники, выполненные из твердых материалов (например, искусственного корунда или твердых сплавов), создают локальную зону контакта, где возникают упругие и пластические деформации [6]. Величина этих деформаций зависит от измерительного усилия, радиуса наконечника, а также механических свойств материалов контактирующих поверхностей [7]. Для коррекции погрешностей, вызванных контактными деформациями, необходимо точно измерить размеры пятна контакта, что требует применения оптических методов и специализированных алгоритмов обработки изображений [9].
Разработанная экспериментальная установка, использующая стеклянный сферический наконечник и видеокамеру, позволяет визуализировать зону контакта. Однако получаемые изображения характеризуются размытостью границ из-за оптических искажений, неоднородного освещения и микрогеометрии поверхности, что затрудняет определение диаметра пятна контакта. Для решения этой проблемы был разработан алгоритм обработки изображений, реализованный на языке Python с использованием библиотеки OpenCV. Алгоритм обеспечивает выделение пятна контакта, определение его границ и вычисление диаметра с учетом адаптивных пороговых значений, что позволяет компенсировать нечеткость изображений. Далее описывается методика обработки изображений, включая математическую основу и программную реализацию.
Обработка начинается с преобразования исходного цветного изображения, полученного с экспериментальной установки, в оттенки серого. Это необходимо для упрощения последующей бинаризации и уменьшения влияния цветовых вариаций. Преобразование выполняется путем взвешенного суммирования каналов RGB по формуле:
где ,
,
– интенсивности красного, зеленого и синего каналов соответственно. Далее изображение бинаризуется с использованием порогового метода. Интенсивность пикселя
сравнивается с пороговым значением
, задаваемым пользователем (в экспериментах
). Бинарное изображение формируется по правилу:
Инверсия (параметр ) обеспечивает выделение пятна контакта как белой области (
) на черном фоне (
), что соответствует яркой зоне контакта на изображении. Возможность настройки порогового значения
позволяет адаптировать алгоритм к различным условиям освещения и контрастности изображения.
def process_image(image_data, threshold_value=127, invert=False): img_data = base64.b64decode(image_data) img = cv2.imdecode(np.frombuffer(img_data, np.uint8), cv2.IMREAD_COLOR) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) if invert: _, binary = cv2.threshold(gray, threshold_value, 255, cv2.THRESH_BINARY_INV) else: _, binary = cv2.threshold(gray, threshold_value, 255, cv2.THRESH_BINARY) return img, binary |
Для идентификации пятна контакта применяется алгоритм заливки (), который обходит связанные белые пиксели со значением
. Начиная с начального пикселя
, алгоритм проверяет условие
и добавляет соседние пиксели
,
,
,
в стек для обработки. Используется 4-связность, что означает рассмотрение только горизонтальных и вертикальных соседей. Результатом является множество
, представляющее связную область, соответствующую пятну контакта. Формально множество
определяется как:
где достижимость определяется через последовательность соседних пикселей с одинаковым значением интенсивности. Этот этап позволяет выделить пятно контакта даже на изображениях с шумами или размытыми границами.
def flood_fill(image, start_x, start_y, target_color=255): if image[start_y, start_x] != target_color: return set() height, width = image.shape stack = [(start_x, start_y)] visited = set() while stack: x, y = stack.pop() if (x, y) in visited or x < 0 | x >= width or y < 0 or y >= height: continue if image[y, x] != target_color: continue visited.add((x, y)) stack.extend([(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]) return visited |
После выделения пятна контакта вычисляются его геометрические характеристики. Для множества пикселей определяются границы области
,
,
,
.
Диаметр пятна контакта определяется как максимальное расстояние по горизонтали или вертикали:
Центр пятна вычисляется как среднее значение координат границ:
Для исключения шумов и артефактов, таких как мелкие пятна или случайные области, диаметр фильтруется по заданным пределам где в экспериментах
пикселей,
пикселей. Радиус пятна определяется как
. Этот подход позволяет надежно выделять пятно контакта, игнорируя посторонние объекты на изображении.
def find_shapes(binary_image, min_diameter, max_diameter): height, width = binary_image.shape visited = set() shapes = [] for y in range(height): for x in range(width): if binary_image[y, x] == 255 and (x, y) not in visited: circle_pixels = flood_fill(binary_image, x, y) if circle_pixels: visited.update(circle_pixels) min_x = min(x for x, y in circle_pixels) max_x = max(x for x, y in circle_pixels) min_y = min(y for x, y in circle_pixels) max_y = max(y for x, y in circle_pixels) diameter = max(max_x - min_x, max_y - min_y) center_x = (min_x + max_x) // 2 center_y = (min_y + max_y) // 2 if min_diameter <= diameter <= max_diameter: shapes.append((diameter, (center_x, center_y))) return shapes |
Результаты обработки визуализируются путем нанесения окружности с центром и радиусом
на исходное изображение. Уравнение окружности задается как:
Окружность отрисовывается зеленым цветом, а центр отмечается красной точкой. Кроме того, бинарное изображение отображается для контроля качества выделения пятна контакта. Этот этап позволяет оператору визуально оценить корректность работы алгоритма и при необходимости скорректировать пороговое значение или другие параметры.
shapes = find_shapes(binary_image, MIN_DIAMETER, MAX_DIAMETER) for i, (diameter, (center_x, center_y)) in enumerate(shapes, 1): print(f"Фигура {i}: Диаметр = {diameter} пикселей, Центр = ({center_x}, {center_y})") radius = diameter // 2 cv2.circle(original_image, (center_x, center_y), radius, (0, 255, 0), 2) cv2.circle(original_image, (center_x, center_y), 2, (0, 0, 255), 3) display_image(original_image, "Image with Detected Circles") display_image(binary_image, "Binary Image with Shapes") |
|
|
|
Рисунок 1. Результаты обработки изображений
Разработанный алгоритм обладает рядом преимуществ. Во-первых, адаптивность порогового значения позволяет учитывать различные условия освещения и контрастности изображений. Во-вторых, использование фильтрации по диаметру исключает влияние шумов и мелких артефактов.
Однако алгоритм чувствителен к качеству изображения при значительной размытости или низком контрасте точность определения границ пятна контакта может снижаться. Для повышения надежности в будущем планируется внедрение методов субпиксельной обработки и коррекции оптических искажений.
