Я хочу обнаружить пыльцевые зерна, но созданная мной маска обнаружения не работает. Вот результаты, которые я получаю:
Исходное изображение:
![enter image description here](https://i.stack.imgur.com/vl3iy.jpg)
Изображение HSV:
![enter image description here](https://i.stack.imgur.com/Tbpr2.jpg)
Нерабочая маска:
![enter image description here](https://i.stack.imgur.com/Edh1V.jpg)
Сначала я конвертирую изображение 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()