Задать вопрос
@Mr_Fursov

Нужно дополнить код в Python. Как добавить значения к цветам или выделить контуры более детально с прикреплением значений?

Не являюсь программистом. Есть код который написал с помощью ютуба и ИИ хвалебных. Получилось два варианта решения моей проблемы. Проблема такая, есть изображение(682bcb68560d2487829659.png) с определенным хаотичным градиентом цветов. Каждый цвет несет в себе информацию о перемещении по оси Z. Значения перемещений начинается от 0.00м до 0.18м (в цвете это от зеленого до красного 682bca054baf7565658706.png). В первом варианте сделал код с помощью ИИ который делает контур как изополя в программных комплексах по типу SCAD Office или Lira Sapr. Идея была такова, что на изображении выделяю контуры и на каждом контуре выдаю среднее значение по градиенту с помощью функции момента в cv2. Но столкнулся с тем, что не могу понять как более детально выделять контур на изображении и внести данные значением.
Вот мой не до код:
import cv2
import numpy as np

# Загрузка изображения
image = cv2.imread('22.png')
output = image.copy()

# 1. Предобработка для градиентов
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)

# 2. Адаптивное пороговое преобразование
thresh = cv2.adaptiveThreshold(
    blurred,
    255,
    cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
    cv2.THRESH_BINARY_INV,
    blockSize=35,  # Размер локальной области (подберите под ваш случай)
    C=4           # Константа для уточнения порога
)

# 3. Морфологические операции для соединения разрывов
kernel = np.ones((3,3), np.uint8)
processed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=2)
processed = cv2.morphologyEx(processed, cv2.MORPH_OPEN, kernel, iterations=1)

# 4. Поиск контуров
contours, hierarchy = cv2.findContours(
    processed,
    cv2.RETR_TREE,
    cv2.CHAIN_APPROX_NONE
)

# 5. Фильтрация контуров
min_area = 1000  # Минимальная площадь контура
filtered_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > min_area]

# 6. Визуализация
cv2.drawContours(output, filtered_contours, -1, (0,0,0), 2)

# Отображение промежуточных результатов
cv2.imshow('1. Original', image)
cv2.imshow('4. Final Result', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

img_path = "22.png"

img = cv2.imread(img_path)
b = g = r = 0
clicked = False


def color_function(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONUP:
        global b, r, g, clicked
        b, g, r = img[y, x]
        b = int(b)
        g = int(g)
        r = int(r)
        clicked = True


cv2.namedWindow("main")
cv2.setMouseCallback("main", color_function)

while True:
    cv2.imshow("main", img)

    if clicked:
        cv2.rectangle(img, (20, 20), (700, 60), (b, g, r), -1)
        if b + g + r <= 400:
            cv2.putText(img, "R = " + str(r) + "; G = " + str(g) + "; B = " + str(b), (50, 50), 2, 1.0, (255, 255, 255))
        else:
            cv2.putText(img, "R = " + str(r) + "; G = " + str(g) + "; B = " + str(b), (50, 50), 2, 1.0, (0, 0, 0))
        clicked = False

    if cv2.waitKey(20) & 0xFF == 27:
        break

cv2.destroyAllWindows()

Пожалуйста, помогите решить, предложить другое решение или хотя бы где посмотреть-почитать мало понимающему в этой теме человеку.
  • Вопрос задан
  • 149 просмотров
Подписаться 2 Средний 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы