Из одного и того же входного изображения я вычисляю две двоичные маски:
- [/b] – все пиксели красного цвета (0 или 255)
Код: Выделить всё
red_mask - [/b] – обнаруженная структура ткани/нити (0 или 255)
Код: Выделить всё
fabric_mask
Моя цель — сохранить только красные пиксели, которые структурно поддерживаются нитями ткани, и удалить красные пиксели, лежащие в промежутках или за пределами структуры нити.
Что я ожидал
При объединении двух масок я ожидал, что результат:
- Сохранит красные пиксели, расположенные вдоль нитей ткани
- Удалит красные пиксели, которые:
Заполнение промежутков ниток - Перекрещивание нитей без соблюдения их геометрии
- Не поддерживается соседними пикселями ткани
Другими словами, красные пиксели должны оставаться только там, где структура ткани непрерывно существует под ними их.
Что происходит на самом деле
Использование прямой логической операции:
Код: Выделить всё
result = cv2.bitwise_and(red_mask, fabric_mask)
- Красные пиксели исчезают в тонких или разорванных областях ткани
- Красные пиксели сохраняются в областях, где они касаются структуры лишь на несколько пикселей
- Красные области, частично перекрывающие ткань, остаются, даже если они охватывают пробелы
Поэтому, хотя операция математически правильна, она семантически неверна для этой задачи.
Минимальный Воспроизводимый пример
Код: Выделить всё
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
Мобильная версия