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

) с определенным хаотичным градиентом цветов. Каждый цвет несет в себе информацию о перемещении по оси Z. Значения перемещений начинается от 0.00м до 0.18м (в цвете это от зеленого до красного

). В первом варианте сделал код с помощью ИИ который делает контур как изополя в программных комплексах по типу 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()
Пожалуйста, помогите решить, предложить другое решение или хотя бы где посмотреть-почитать мало понимающему в этой теме человеку.