LINUX.ORG.RU

OpenCV: Как найти средний(mean, average) цвет внутри контура?

 ,


0

1

По идее, этот код позволяет получить средний цвет внутри каждого контура и нарисовать контуры с этим цветом на конечном изображении. Но у меня появляеться ошибка с маской.

import cv2
import numpy as np
image = cv2.imread("3.jpg")


clahe = cv2.createCLAHE(clipLimit=3., tileGridSize=(8,8))

lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)  #convert from BGR to LAB color space
l, a, b = cv2.split(lab)  # split on 3 different channels

l2 = clahe.apply(l)  #apply CLAHE to the L-channel

lab = cv2.merge((l2,a,b))  #merge channels
img2 = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)  #convert from LAB to BGR

blur = cv2.GaussianBlur(img2, (7,7), 0)
hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV)

mask1 = cv2.inRange(hsv, (0,0,0), (179,255,70))

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7,7))
opening = cv2.morphologyEx(mask1, cv2.MORPH_OPEN, kernel, iterations=1)

close = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel, iterations=2)#this is monchrome image for recognition

   
contours,h = cv2.findContours(close,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

final = np.zeros(image.shape,np.uint8)
mask = np.zeros(hsv.shape,np.uint8)

for i in range(0,len(contours)):
    mask[...]=0
    cv2.drawContours(mask,contours,i,255,-1)
    cv2.drawContours(final,contours,i,cv2.mean(image,mask),-1)

 
cv2.imshow('final',final)
cv2.waitKey(0)

Ошибка которую я получаю:

cv2.error: OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-sn_xpupm\opencv\modules\core\src\mean.dispatch.cpp:126: error: (-215:Assertion failed) mask.empty() || mask.type() == CV_8U in function 'cv::mean'

Заранее спасибо!

Конечно появляется. Это плохо что ты синтаксис не выучил и матчасть. Фикси

mask = np.zeros(hsv.shape,np.uint8)
Короче у тебя картинка в несколько каналов, а маска накладывается только в один (принципиально только в один). И вообще, твой вопрос элементарно решается.

peregrine ★★★★★ ()
Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от peregrine

Спасибо! Да в гуглиле был такой ответ на Stacke"mask = np.zeros(hsv.shape[:2], np.uint8) ", и почему ошибка дальше появлялась, видимо кое-кто забыл сохранить перед дебагом XD. Ну или из-за других мелких ошибок. Еще раз огромное спасибо! Если Вам не сложно можно попросить какой-то учебник для изучения матчасти?

katemisik ()
Ответ на: комментарий от katemisik

Гугл. Гуглом пользуйся. Смотри, у меня технических вопросов на ЛОР-е десяток, наверное, на которые гугл вразумительных ответов не дал или которые я сформулировать нормально не смог. У тех кто более пряморукий всё ещё лучше. А у тебя только вопросы к гуглу. Плохо это.

peregrine ★★★★★ ()
Ответ на: комментарий от katemisik

видимо кое-кто забыл сохранить перед дебагом XD

Ещё один минус в панамку любителей кодить в текстовых редакторах по типу вима. В нормальных IDE сохранение при сборке/запуски штатная фича.

Есть же PyCharm.

ox55ff ★★★★★ ()