Как улучшить динамическое обнаружение c центра области интереса - PullRequest
0 голосов
/ 03 марта 2020

У меня есть изображения МРТ, сгруппированные в виде трехмерного массива (2D и срезы), изображения поступают с разных машин, поэтому пространственное разрешение отличается от одного к другому, я хочу динамически вырезать ROI из всех них.

Разрез будет зависеть от обнаружения круга, который является моей достопримечательностью (радиус и форма круга меняются от среза к другому, потому что он представляет движение сердца). для этого я пытаюсь:

  1. найти центры всех обнаруженных окружностей.
  2. получить среднее значение всех центров окружностей.

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

Есть ли какое-либо решение (без исчерпывающего вычисления ковариационной матрицы), чтобы исключить эти драсти c баллов?

MRI with different circles Original image

#============================================
 def processImage(img,kernel_size):
  #gray = cv.cvtColor(img, cv2.COLOR_BGR2GRAY)
  #blur = cv.GaussianBlur(img, (kernel_size,kernel_size), 0)
  thresh = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY,11,2)
  blur = cv.GaussianBlur(thresh, (kernel_size,kernel_size), 0)
  #thresh = cv.Canny(blur, 50, 150)      
  return blur
 #--------------------------------------------
 #============================================
 def locateCenters(self,img,ker_sz):
  # define circles center & initialization
  centers = np.array([[90,120]],dtype=int)  
  # loop all the slices
  for idx in range(img.shape[2]): 
   #convert the pixels to uint8
   imag = img[:,:,idx].astype('uint8') 
   # PreProcessing for Images
   img_pro = ROI.processImage(imag,ker_sz)
   # Detecting circles
   circles = cv.HoughCircles(img_pro,cv.HOUGH_GRADIENT,1,10, param1=40,param2=50,minRadius=10,maxRadius=35)
   # check wrther if there is circles or not
   if circles is not None : 
    circles = np.uint16(np.around(circles))
    #print(circles[0,:])
    for i in circles[0,:]:
     centers = np.append(centers, [[i[0],i[1]]],axis = 0).astype(int)
  center = np.mean(centers,axis=0,dtype=np.int)#.reshape(1,2)
  print("Center ",center,"\nCenters:",centers.shape)
  x,y = center
  return x,y
 #--------------------------------------------

1 Ответ

0 голосов
/ 06 апреля 2020

Решением было взять 4D-изображение (3D + время) и использовать стандартное отклонение для определения местоположения сердца (поскольку оно всегда движется).

...