OpenCV: удаление красных пикселей, которые структурно не поддерживаются маской ткани/нити (проблема несоответствия маскиPython

Программы на Python
Ответить
Anonymous
 OpenCV: удаление красных пикселей, которые структурно не поддерживаются маской ткани/нити (проблема несоответствия маски

Сообщение Anonymous »

Описание проблемы
Из одного и того же входного изображения я вычисляю две двоичные маски:
  • Код: Выделить всё

    red_mask
    [/b] – все пиксели красного цвета (0 или 255)
  • Код: Выделить всё

    fabric_mask
    [/b] – обнаруженная структура ткани/нити (0 или 255)
Обе маски правильны по отдельности и выровнены по пикселям.
Моя цель — сохранить только красные пиксели, которые структурно поддерживаются нитями ткани, и удалить красные пиксели, лежащие в промежутках или за пределами структуры нити.

Что я ожидал
При объединении двух масок я ожидал, что результат:
  • Сохранит красные пиксели, расположенные вдоль нитей ткани
  • Удалит красные пиксели, которые:

    Заполнение промежутков ниток
  • Перекрещивание нитей без соблюдения их геометрии
  • Не поддерживается соседними пикселями ткани

Другими словами, красные пиксели должны оставаться только там, где структура ткани непрерывно существует под ними их.

Что происходит на самом деле
Использование прямой логической операции:

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

result = cv2.bitwise_and(red_mask, fabric_mask)
дает следующий нежелательный, но технически правильный результат:
  • Красные пиксели исчезают в тонких или разорванных областях ткани
  • Красные пиксели сохраняются в областях, где они касаются структуры лишь на несколько пикселей
  • Красные области, частично перекрывающие ткань, остаются, даже если они охватывают пробелы
Это происходит потому, что bitwise_and проверяет только попиксельное перекрытие, а не геометрическую или структурную согласованность.
Поэтому, хотя операция математически правильна, она семантически неверна для этой задачи.

Минимальный Воспроизводимый пример

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

import cv2
import numpy as np

img = cv2.imread("input.png")

# Red mask
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

lower_red1 = np.array([0, 70, 30])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([170, 70, 30])
upper_red2 = np.array([180, 255, 255])

red_mask = (
cv2.inRange(hsv, lower_red1, upper_red1) |
cv2.inRange(hsv, lower_red2, upper_red2)
)

# Fabric structure mask (precomputed)
fabric_mask = cv2.imread("fabric_mask.png", cv2.IMREAD_GRAYSCALE)

# Logical combination
result = cv2.bitwise_and(red_mask, fabric_mask)

cv2.imwrite("result.png", result)
Почему этого недостаточно
Хотя операция математически обоснована, она не отражает фактическое требование:
  • Структурная непрерывность
  • Поддержка соседства
  • Выравнивание с тонкими направленными элементами
Эта проблема представляет собой не простую булеву задачу маскировки, а проблему структурной согласованности.

Что я ищу
классический OpenCV/математический подход для удаления красных пикселей, которые:
  • Не поддерживается структурой ткани постоянно
  • Затрагивает структуру только в отдельных пикселях
  • Пересечение промежутков или пустот ткани
Примеры приемлемых подходов:
  • Фильтрация на основе преобразования расстояния
  • Проверка на основе соседства
  • Проверка скелета или согласованности толщины
  • Направленная морфология в соответствии с ориентацией ткани
Важное примечание
Предпочтительно использовать чисто классическое решение.

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

Изображение

Вопрос
Каков правильный классический подход CV для обеспечения структурной поддержки между двумя выровненными двоичными масками, помимо простых попиксельных логических операций?

Подробнее здесь: https://stackoverflow.com/questions/798 ... abric-thre
Ответить

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

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

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

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

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