Автоматизированное определение величины зерна стали по ASTM E112, ISO 643 и ГОСТ 5639 с использованием OpenCV. image processing.. image processing. opencv.. image processing. opencv. Python OpenCV.. image processing. opencv. Python OpenCV. анализ микроструктуры.. image processing. opencv. Python OpenCV. анализ микроструктуры. выделение границ.. image processing. opencv. Python OpenCV. анализ микроструктуры. выделение границ. компьютерное зрение.. image processing. opencv. Python OpenCV. анализ микроструктуры. выделение границ. компьютерное зрение. металлография.. image processing. opencv. Python OpenCV. анализ микроструктуры. выделение границ. компьютерное зрение. металлография. морфологические операции.. image processing. opencv. Python OpenCV. анализ микроструктуры. выделение границ. компьютерное зрение. металлография. морфологические операции. Обработка изображений.. image processing. opencv. Python OpenCV. анализ микроструктуры. выделение границ. компьютерное зрение. металлография. морфологические операции. Обработка изображений. сегментация изображений.

Введение

Оценка величины зерна является одной из базовых задач количественной металлографии, поскольку размер зерна напрямую связан с комплексом механических свойств металла: прочностью, пластичностью, ударной вязкостью, склонностью к хрупкому разрушению и стабильностью свойств после термической обработки. В промышленной практике для определения величины зерна широко применяются стандарты ASTM E112, ISO 643 и ГОСТ 5639.

Несмотря на наличие формализованных методик, в реальной лабораторной практике анализ по-прежнему часто выполняется с опорой на визуальное сравнение микроструктуры с эталонными шкалами. Такой подход удобен и быстр, однако имеет ряд известных ограничений: высокая зависимость от квалификации эксперта, межоператорный разброс, чувствительность к качеству травления и освещения, а также трудности воспроизводимого документирования результата.

В данной статье рассматривается практическая реализация системы автоматизированного анализа зеренной структуры стали на Python с использованием OpenCV. Цель разработки состояла не в замене стандартизованных методов их упрощённой цифровой имитацией, а в создании воспроизводимого инструмента, который позволяет приблизить лабораторный анализ к количественной обработке изображений и обеспечить прослеживаемость результата.

Нормативная основа

ASTM E112

Стандарт ASTM E112 описывает несколько подходов к определению среднего размера зерна, включая:

  • сравнительный метод;

  • планиметрический метод;

  • метод секущих.

Для автоматизированного анализа особенно важны два направления:

  1. оценка через число зерен на единицу площади;

  2. оценка через среднюю длину пересечений границ зерен тестовыми линиями.

Номер зерна ASTM традиционно связывают с числом зерен на единице площади через зависимость вида:

Автоматизированное определение величины зерна стали по ASTM E112, ISO 643 и ГОСТ 5639 с использованием OpenCV - 1

где
N — число зерен на заданной площади при стандартном увеличении,
G — номер зерна.

ISO 643

ISO 643 ориентирован на металлографическое определение размера зерна и допускает использование:

  • сравнительных шкал;

  • метода линейных пересечений;

  • метода круговых пересечений.

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

ГОСТ 5639

ГОСТ 5639 регламентирует определение величины зерна для металлов и сплавов и также опирается на:

  • метод сравнения со шкалами;

  • подсчёт пересечений;

  • измерение длин хорд.

С инженерной точки зрения автоматизация по ГОСТ 5639 близка к задачам, возникающим при реализации ISO 643: требуется корректно выделить границы зерен, затем либо подсчитать пересечения, либо оценить размерные характеристики объектов.

Постановка задачи

Практическая цель разработки состояла в решении следующих задач:

  • автоматическое выделение зеренной структуры на металлографическом изображении;

  • разделение отдельных зерен даже при неполном или неоднородном травлении;

  • вычисление морфометрических параметров;

  • пересчёт результатов в величину зерна по действующим стандартам;

  • снижение межоператорной вариабельности;

  • формирование воспроизводимого протокола анализа.

При этом система должна была работать не только на «идеальных» изображениях, но и в условиях реальной лаборатории:

  • различное качество подготовки шлифа;

  • вариации освещения;

  • шум камеры;

  • неодинаковая резкость;

  • разная степень выраженности границ зерна.

Общий алгоритм обработки

В основе решения лежит последовательный pipeline обработки изображений, реализованный средствами OpenCV.

1. Загрузка и нормализация изображения

На первом этапе изображение приводится к рабочему формату. В реальной практике это особенно важно, поскольку лабораторные системы могут выдавать:

  • 8-bit grayscale;

  • 12-bit или 16-bit изображения;

  • цветные BGR-кадры с камеры.

Поэтому сначала выполняется:

  • чтение изображения;

  • перевод в градации серого;

  • нормализация динамического диапазона;

  • при необходимости — робастное контрастирование по процентилям.

Типичный фрагмент логики выглядит так:

import cv2
import numpy as np

def to_uint8_canonical(img: np.ndarray,
                       low_p: float = 1.0,
                       high_p: float = 99.0) -> np.ndarray:
    if img is None:
        return None

    if img.dtype == np.uint8:
        return img

    x = img.astype(np.float32)
    x = np.nan_to_num(x, nan=0.0, posinf=0.0, neginf=0.0)

    lo, hi = np.percentile(x, [low_p, high_p])
    if hi <= lo + 1e-6:
        return np.zeros_like(x, dtype=np.uint8)

    x = (np.clip(x, lo, hi) - lo) / (hi - lo) * 255.0
    return np.clip(x, 0, 255).astype(np.uint8)

img = cv2.imread("microstructure.png", cv2.IMREAD_UNCHANGED)
img_u8 = to_uint8_canonical(img)

if len(img_u8.shape) == 3:
    gray = cv2.cvtColor(img_u8, cv2.COLOR_BGR2GRAY)
else:
    gray = img_u8.copy()

Такой этап кажется вспомогательным, но именно он часто определяет устойчивость всех последующих шагов.

2. Улучшение контраста и подавление неоднородности освещения

Металлографические изображения нередко страдают от неоднородного освещения поля зрения, особенно при работе с широкими полями или при неидеально настроенной оптике. Для повышения локального контраста удобно использовать CLAHE.

clahe = cv2.createCLAHE(clipLimit=2.5, tileGridSize=(8, 8))enhanced = clahe.apply(gray)

Дополнительно может использоваться сглаживание для подавления высокочастотного шума:

smoothed = cv2.GaussianBlur(enhanced, (5, 5), 1.2)

Если на изображении выражен градиент освещения, полезна оценка фона через морфологическое opening и последующая коррекция:

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (41, 41))background = cv2.morphologyEx(smoothed, cv2.MORPH_OPEN, kernel)corrected = cv2.divide(smoothed, np.maximum(background, 1), scale=255)corrected = np.clip(corrected, 0, 255).astype(np.uint8)

3. Выделение границ зерен

Следующий этап — построение карты границ. В зависимости от характера изображения для этого могут использоваться:

  • градиент Собеля;

  • морфологический градиент;

  • адаптивная бинаризация;

  • комбинация нескольких методов.

Один из устойчивых вариантов — вычисление градиента и последующая бинаризация:

grad_x = cv2.Sobel(corrected, cv2.CV_32F, 1, 0, ksize=3)
grad_y = cv2.Sobel(corrected, cv2.CV_32F, 0, 1, ksize=3)
grad = cv2.magnitude(grad_x, grad_y)

grad_u8 = cv2.normalize(grad, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)
_, edges = cv2.threshold(grad_u8, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

После этого обычно требуются морфологические операции, поскольку реальные границы зерен редко бывают полностью замкнутыми:

kernel = np.ones((3, 3), np.uint8)
edges = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel, iterations=2)
edges = cv2.morphologyEx(edges, cv2.MORPH_OPEN, kernel, iterations=1)

4. Сегментация зерен

Если карта границ получена достаточно качественно, следующая задача — разделить изображение на отдельные области. На практике для этого удобно применять distance transform и watershed.

Типовая схема:

  1. построить бинарную маску зеренных областей;

  2. вычислить distance transform;

  3. выделить маркеры;

  4. применить watershed.

inv = cv2.bitwise_not(edges)

dist = cv2.distanceTransform(inv, cv2.DIST_L2, 5)
dist_norm = cv2.normalize(dist, None, 0, 1.0, cv2.NORM_MINMAX)

_, sure_fg = cv2.threshold(dist_norm, 0.25, 1.0, cv2.THRESH_BINARY)
sure_fg = (sure_fg * 255).astype(np.uint8)

sure_bg = cv2.dilate(inv, kernel, iterations=2)
unknown = cv2.subtract(sure_bg, sure_fg)

num_labels, markers = cv2.connectedComponents(sure_fg)
markers = markers + 1
markers[unknown == 255] = 0

color = cv2.cvtColor(corrected, cv2.COLOR_GRAY2BGR)
markers = cv2.watershed(color, markers)

После работы watershed каждая область получает собственную метку. Это уже не просто картинка, а полноценная label map, пригодная для морфометрии.

Морфометрический анализ

После сегментации можно выделить контуры каждого зерна и вычислить параметры, представляющие интерес для количественной оценки:

  • площадь;

  • периметр;

  • эквивалентный диаметр;

  • коэффициент формы;

  • aspect ratio;

  • кругловатость;

  • координаты центра тяжести.

Если известна калибровка в мкм на пиксель, пиксельные параметры легко переводятся в физические единицы.

Определение величины зерна

Планиметрический подход

При наличии корректно сегментированных областей можно определить число зерен на единицу площади и далее пересчитать результат в номер зерна по ASTM E112 или сопоставимым шкалам.

Пусть:

  • n — количество зерен;

  • A — площадь анализируемого поля;

    плотность зерен.

    плотность зерен.

Далее выполняется стандартный пересчёт с учетом увеличения и нормативной зависимости.

ASTM E112: G=8.5 ± 1.59

ASTM E112: G = 8.5 ± 1.59
Автоматизированное определение величины зерна стали по ASTM E112, ISO 643 и ГОСТ 5639 с использованием OpenCV - 4
пример сегментации на больших панорамах

пример сегментации на больших панорамах

Метод пересечений

С точки зрения соответствия ISO 643 и ГОСТ 5639 особенно важен метод пересечений. В цифровой реализации он строится следующим образом:

  1. на изображение накладываются тестовые линии;

  2. определяется число пересечений этих линий с границами зерен;

  3. рассчитывается средняя длина пересечения;

  4. по нормативным формулам оценивается величина зерна.

Преимущество этого подхода в том, что он менее чувствителен к ошибкам полной сегментации области, чем планиметрический метод. Если границы зерен определены удовлетворительно, метод пересечений часто оказывается более устойчивым в сложных случаях.

В прикладной реализации линии можно задавать:

  • вручную;

  • автоматически по сетке;

  • в виде прямых или круговых тестовых траекторий.

Роль OpenCV в реализации

Использование OpenCV оказалось особенно удобным по нескольким причинам.

Во-первых, библиотека предоставляет быстрые и отлаженные базовые примитивы:

  • фильтрацию;

  • морфологию;

  • градиентные операторы;

  • бинаризацию;

  • distance transform;

  • watershed;

  • поиск контуров;

  • геометрические измерения.

Во-вторых, OpenCV хорошо интегрируется с NumPy и PyQt, что позволяет объединить:

  • вычислительное ядро;

  • интерактивную визуализацию;

  • ручную коррекцию результатов;

  • экспорт в отчёты.

В-третьих, для задач металлографии важна не только точность, но и предсказуемость работы алгоритма. В этом смысле классические методы компьютерного зрения, реализованные в OpenCV, обладают важным преимуществом: они прозрачны и легче интерпретируются по сравнению с полностью «чёрными ящиками».

Основные сложности

В процессе разработки стало очевидно, что автоматическое определение величины зерна — это не просто задача сегментации. На практике основные трудности связаны со следующими факторами.

Неполная выраженность границ

Даже после качественного травления часть границ остаётся слабоконтрастной. Это приводит к разрывам контуров и ошибкам при watershed.

Пере- и недосегментация

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

Различие структур

Равноосные зерна анализируются заметно проще, чем деформированные, вытянутые или неоднородные структуры. Поэтому универсальные параметры редко работают одинаково хорошо на всех типах изображений.

Качество исходной подготовки

Алгоритм не способен полностью компенсировать плохую подготовку шлифа, некачественное травление или дефокусировку. Автоматизация повышает воспроизводимость, но не отменяет требования к корректной металлографической подготовке.

Валидация результатов

С точки зрения практического внедрения ключевым является не сам факт автоматического расчёта, а вопрос доверия к результату. Поэтому валидация должна строиться на сравнении с экспертной оценкой.

Рациональный подход включает:

  • независимую оценку изображения несколькими металлографами;

  • сравнение результатов между экспертами;

  • сравнение результата системы с экспертным консенсусом;

  • анализ расхождений в пограничных случаях.

Особый интерес представляют ситуации, когда различие между людьми сопоставимо с различием между человеком и алгоритмом. Именно здесь цифровой анализ приобретает практический смысл: он не устраняет полностью неопределённость структуры, но делает её измеримой и документируемой.

Практическое значение

Автоматизация определения величины зерна даёт несколько прикладных преимуществ:

  • снижение субъективности;

  • ускорение анализа;

  • единообразие протоколов;

  • накопление цифровой базы результатов;

  • возможность последующего аудита расчёта;

  • интеграция с другими модулями количественной металлографии.

Иными словами, лаборатория получает не только число в протоколе, но и воспроизводимый маршрут, по которому это число было получено.

Заключение

Определение величины зерна по ASTM E112, ISO 643 и ГОСТ 5639 может быть переведено из преимущественно визуальной процедуры в область воспроизводимого цифрового анализа. Использование OpenCV позволяет реализовать полный цикл обработки металлографического изображения: от нормализации и выделения границ до сегментации, морфометрии и расчёта итогового номера зерна.

Разумеется, такая система не отменяет роли эксперта. Однако она меняет характер его участия. Эксперт перестаёт быть единственным источником результата и становится верификатором и интерпретатором количественных данных.

Именно в этом, на мой взгляд, и заключается переход от классической металлографии к цифровой: от формулировки «похоже на такой-то номер зерна» к формулировке «структура проанализирована, измерена и документирована по воспроизводимому алгоритму».

Автор: SenseOptics

Источник

Rambler's Top100