Как найти цвет контуров в OpenCv с помощью Python

Я работаю с требованием, в котором мне нужно найти цвет области внутри контуров. Мы используем OpenCv с Python, и вот мой код на Python:

import imutils
import cv2
import numpy as np

path = "multiple_grains_1.jpeg"
img = cv2.imread(path)
resized = imutils.resize(img, width=900)
ratio = img.shape[0] / float(resized.shape[0])
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)

(ret, thresh) = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
edge = cv2.Canny(thresh, 100, 200)
( _,cnts, _) = cv2.findContours(edge.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

for c in cnts:
    rect = cv2.minAreaRect(c)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    area = cv2.contourArea(c)
    if area > 1:
        cv2.drawContours(resized,[box],0,(0,0,255),2)
        cv2.drawContours(resized, [c], -1, (0, 255, 0), 2)
        #print("area : "+str(area))
        #print('\nContours: ' + str(c[0]))
        #img[c[0]]
        pixelpoints = np.transpose(np.nonzero(c))
        #print('\pixelpoints: ' + str(pixelpoints))

        #  accessed the center of the contour using the followi
        M = cv2.moments(c)
        if M["m00"] != 0:
            cX = int((M["m10"] / M["m00"]) * ratio)
            cY = int((M["m01"] / M["m00"]) * ratio)
            #print (cX,cY)

            cord = img[int(cX)+3,int(cY)+3]
            print(cord)


cv2.imshow("Output", resized)
cv2.waitKey(0)
exit()

Как найти цвет контуров в OpenCv с помощью Python

Когда я проверяю цвет центроида контура, я не могу получить правильный цвет. Кто-нибудь знает, как получить цвет внутри контура с помощью OpenCv и python?

Используйте KMeans, чтобы получить доминирующий цвет в области, указанной контуром.

zindarod 31.07.2018 15:12

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

Gowthaman 31.07.2018 15:18

@zindarod можешь написать на него ответ. Так что я могу знать, как действовать дальше.

Seenu69 31.07.2018 15:21

@ Seenu69 эта статья прекрасно это объясняет.

zindarod 31.07.2018 15:22

@zindarod ок..спасибо

Seenu69 31.07.2018 15:25

Вы также можете инвертировать cv2.connectedComponents и cv2.connectedComponentsWithStats. Возможно, этот programcreek.com/python/example/89340/… может помочь

John_Sharp1318 31.07.2018 15:27

Не могли бы вы отметить как решенное? Или, по крайней мере, объясните, почему ответ - не то, что вы искали.

Fred Guth 25.08.2018 12:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
7
3 008
1

Ответы 1

Я упростил ваш код и смог получить цвет центроидов без использования момента.

import imutils
import cv2
import numpy as np
import matplotlib.pyplot as plt


img = cv2.imread("multiplegrains.png")
resized = imutils.resize(img, width=900)
ratio = img.shape[0] / float(resized.shape[0])
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
_, cnts, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# if you want cv2.contourArea >1, you can just comment line bellow
cnts = np.array(cnts)[[cv2.contourArea(c)>10 for c in cnts]]
grains = [np.int0(cv2.boxPoints(cv2.minAreaRect(c))) for c in cnts]
centroids =[(grain[2][1]-(grain[2][1]-grain[0][1])//2, grain[2][0]-(grain[2][0]-grain[0][0])//2) for grain in grains]

colors = [resized[centroid] for centroid in centroids]

Другие вопросы по теме