Точное и надежное обнаружение углов (зашумленное изображение, грязный объект)Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Точное и надежное обнаружение углов (зашумленное изображение, грязный объект)

Сообщение Anonymous »

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

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

def contrast_stretch(image, multiplier=1.0):
min_val = np.min(image)
max_val = np.max(image)
stretched = (image - min_val) * (255 / (max_val - min_val) * multiplier)
stretched = np.clip(stretched, 0, 255).astype(np.uint8)
return stretched

def distance(pt1, pt2):
return math.sqrt((pt2[0] - pt1[0]) ** 2 + (pt2[1] - pt1[1]) ** 2)

def measure_diagonals(image, contours, px_to_mm):
refined_corners = []
for cnt in contours:
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
corners = cv2.cornerSubPix(image, np.float32(box), (5, 5), (-1, -1), (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.1))
refined_corners.append(corners)
if len(refined_corners) >= 2:
d1 = distance(refined_corners[0][0], refined_corners[0][2])
d2 = distance(refined_corners[1][0], refined_corners[1][2])
m1 = d1 * px_to_mm
m2 = d2 * px_to_mm
diff = abs(m2 - m1)
return m1, m2, diff
return None, None, None

# Load calibration data
calibration_data = load_calibration_data(calibration_data_path)
mtx = calibration_data["mtx"]
dist = calibration_data["dist"]

# Load image
frame = cv2.imread(img_path)

# Undistort image
frame_undistorted = cv2.undistort(frame, mtx, dist, None, mtx)

# Convert to grayscale
gray = cv2.cvtColor(frame_undistorted, cv2.COLOR_BGR2GRAY)

# Apply bilateral filter
filtered_image = cv2.bilateralFilter(gray, 9, 125, 25)

# Enhance contrast
enhanced_image = contrast_stretch(filtered_image)

# Detect contours
_, edges = cv2.threshold(enhanced_image, 140, 255, cv2.THRESH_BINARY)
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# Measure diagonals
px_to_mm = 0.1  # Example conversion factor
m1, m2, diff = measure_diagonals(enhanced_image, contours, px_to_mm)
Это пример правильно выбранного угла:
Порог генерации ROI (белая точка), затем закругленный субпиксель (черная точка)
Это пример неправильно выбранного угла:
Красным мы знаем, что это истинный угол.
Я знаю, что нам следует улучшить освещение. Мы измеряем большую площадь (>4 метра), и чрезвычайно сложно иметь систему освещения, которая генерирует яркое, однородное изображение, поэтому мы применяем массу программных корректировок, таких как двусторонний фильтр, усиление и усиление контраста.

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

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

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

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

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

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

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