Как я могу выбрать хороший верхний и нижний диапазон в hsv? - PullRequest
1 голос
/ 09 мая 2020

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

Исходное изображение:

enter image description here

Изображение HSV:

enter image description here

Нерабочая маска:

enter image description here

Сначала я конвертирую изображение RGB в HSV. Затем я ищу целевые контуры. Я не могу использовать функцию cv.findCountours. Если у вас есть другая идея решения, это будет полезно. Также я хочу посчитать количество пыльцевых зерен .

import cv2 as cv
import numpy as np

def rgb2hsv(rgb):
       """
       Input: imagen RGB
       Output: imagen HSV
       """
       rgb = np.float32(rgb)/255
       R=rgb[:,:,0]
       G=rgb[:,:,1]
       B=rgb[:,:,2]
       rows,cols=R.shape

       Cmax=np.maximum(np.maximum(R,G),B)
       Cmin=np.minimum(np.minimum(R,G),B)
       delta= np.subtract(Cmax,Cmin)
       #print('delta:',delta)

       #Calculate Hue
       def hue(R,G,B):
               H= np.zeros((rows,cols),dtype=float)
               for row in range(rows):
                       for col in range(cols):
                               if (Cmax[row,col]==0):
                                       H[row,col]=0
                               elif (Cmax[row,col]==R[row,col]):
                                       H[row,col]=60*(((G[row,col]-B[row,col])/delta[row,col])%6)
                               elif (Cmax[row,col]==G[row,col]):
                                       H[row,col]=60*(((B[row,col]-R[row,col])/delta[row,col])+2)
                               elif (Cmax[row,col]==B[row,col]):
                                       H[row,col]=60*(((R[row,col]-G[row,col])/delta[row,col])+4)

               return H

       #Calculate Saturation
       def saturation(Cmax,delta):
               S= np.zeros((rows,cols),dtype=float)
               for row in range(rows):
                       for col in range(cols):
                               if (Cmax[row,col]==0):
                                       S[row,col]=0;
                               else:
                                       S[row,col]=delta[row,col]/Cmax[row,col]
               return S

       #Calculate Value
       V = Cmax.astype(np.float64)
       hsv=cv.merge((hue(R,G,B),saturation(Cmax,delta),V))
       return hsv


img = cv.imread('pollengrains.jpeg', 1)
cv.imshow('original', img)
hsv = rgb2hsv(img)

cv.imshow('hsv',hsv)
cv.imwrite('hsv.jpg',hsv*255)

mask = cv.inRange(hsv, (148,18,59),(168,38,139))
cv.imshow('mask',mask)
cv.imwrite('mask.jpg',mask*255)
cv.waitKey(0)
cv.destroyAllWindows()
...