Обратная проекция гистограммы на другие пространства
Я пробовал обратную проекцию гистограммы с изображением, свернутым с несколькими ядрами, представляющим собой многомерную матрицу MxNx54. Смотрите пример кода:
supermatrix1=mytransformation(roi) #[M,N,54]
supermatrix2=mytransformation(img)
supermatrix1_split=cv2.split(supermatrix1)
channels=range(supermatrix1.shape[2]) #from 0 to 53
histSize=np.repeat(256,len(channels))
ranges=np.zeros(len(histSize)*2)
ranges[1::2]=histSize
hist = cv2.calcHist(supermatrix1_split, channels, None, histSize, ranges)
cv2.normalize(hist, hist, 0, 255, cv2.NORM_MINMAX)
dst = cv2.calcBackProject([supermatrix2],channels,hist,ranges,1)
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
cv2.filter2D(dst,-1,disc,dst)
Код вылетает на части calcHist, говоря:
SystemError: возвратил NULL без установки ошибки
если я изменю свое преобразование с помощью rgb, у которого есть 3 компонента, не произойдет сбой (хотя это очень плохо при прогнозировании результата). Использование оттенка и насыщенности от компонентов hsv работает отлично, а именно:
supermatrix1=cv2.cvtColor(roi,cv2.COLOR_BGR2HSV) #[M,N,3]
supermatrix2=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
supermatrix1_split=cv2.split(supermatrix1)
channels=[0,1] #h and s
histSize=[180,256]
ranges=np.zeros(len(histSize)*2)
ranges[1::2]=histSize
hist = cv2.calcHist(supermatrix1_split, channels, None, histSize, ranges)
cv2.normalize(hist, hist, 0, 255, cv2.NORM_MINMAX)
dst = cv2.calcBackProject([supermatrix2],channels,hist,ranges,1)
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
cv2.filter2D(dst,-1,disc,dst)
Есть способ заставить его работать, а не вылетать?
Ссылка отсюда: https://docs.opencv.org/3.3.1/dc/df6/tutorial_py_histogram_backprojection.html