Независимый компонентный анализ для отделения объектов от кадра - PullRequest
0 голосов
/ 04 января 2019

У меня есть 200 кадров (100 * 100) каждый в массиве (200, 100, 100). Кадры имеют круги в случайных положениях, смешанные с шумом. Я хочу извлечь круги из этих кадров, используя анализ независимых компонентов. Я попытался работать со sklearn FastICA, он дает случайный смешанный кадр вместо выделенных кругов.

Я ожидал, что каждая линейная комбинация (lc_test) даст круги (отделенные) от каждого кадра, но это дает случайные кадры. ввод: enter image description here код выхода дает (неверно): enter image description here

import numpy as np
import random
from sklearn.decomposition import FastICA, PCA

#Creating Data
def createCircle(width,height , rad ):
  w = random.randint(1, height)
  h = random.randint(1, height)
  center = [int(w), int(h)]
  radius = rad
  Y, X = np.ogrid[:height, :width]
  dist_from_center = np.sqrt((X - center[0])**2 + (Y-center[1])**2)
  mask = dist_from_center <= radius
  return mask

def addCircle(test_image):
  m = createCircle(width = 100, height = 100 , rad = 8 )
  masked_img = test_image.copy()
  masked_img[m] = 0
  return masked_img


def noise(image):
  row,col= image.shape
  mean = 0
  var = 0.1
  sigma = var**0.5
  gauss = np.random.normal(mean,sigma,(row,col))
  gauss = gauss.reshape(row,col)
  noisy = image + gauss #adding gauss noise
  s1 = np.sin(8)   #adding sin fill
  noisy += s1
  return noisy

 img = np.zeros([100,100],dtype=np.uint8)
 img.fill(20)
 img_test = img

 #Making 200 frames
 ims = np.zeros((200, 100, 100)) # initialize your array

 for i in range(1,200):
   for j in range(1,5):
     img_test = addCircle(test_image=img_test)
 im1 = noise(img_test)
 img_test = img
 ims[i, ...] = im1

 print(ims.shape) #(200,100,100)



#Apply Independent Component Analysis on ims
ims_flat = ims.reshape(200,10000)

ica_test = FastICA(max_iter = 3000, tol = 0.3)
s_test= ica_test.fit_transform(ims_flat.T)  #source matrix
print(s_test.shape) #(10000, 200)
a_test = ica_test.mixing_  #mixing matrix
print(a_test.shape) #(200, 200)

#unmixing matrix : inverse of mixing matrix
w_test = np.linalg.inv(a_test) #unmixing matrix
print(w_test.shape) #(200, 200)

#Taking Linear combination of unmixing matrix and ims_flat(original)  to extract Independent components
lc_test = np.linalg.solve(w_test, ims_flat) #Linear combinations
print(lc_test.shape) #(200, 10000)

#plotting Linear combinations
for i in range(1,200):  #Does not extract circles
  plt.imshow(lc_test[i,:].reshape(100, 100))
  plt.show() 

Цель состоит в том, чтобы извлечь / отделить круги от всех 200 кадров.

...