如何改进感兴趣区域中心的动态检测
How to improve the dynamic detection of the center of region of interest
我有按 3D 阵列形状(2D 和切片)分组的 MRI 图像,这些图像来自不同的机器,因此空间分辨率各不相同,我喜欢动态地从所有图像中切出 ROI。
切割将取决于我感兴趣的圆圈的检测(圆圈的半径和形状因切片而异,因为它代表心脏运动)。
为此,我正在尝试:
- 找到所有检测到的圆的中心。
- 获取所有圆心的平均值。
这种方法的问题在于: 检测到的圆圈远离我的兴趣点,这会影响平均值 badly.As 您可以在 图片下码.
是否有任何解决方案(无需详尽计算协方差矩阵)来排除这个极端点?
#============================================
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
#--------------------------------------------
解决方案是拍摄 4D 图像(3D + 时间)并使用标准偏差来定位心脏(因为它一直在移动)。
我有按 3D 阵列形状(2D 和切片)分组的 MRI 图像,这些图像来自不同的机器,因此空间分辨率各不相同,我喜欢动态地从所有图像中切出 ROI。
切割将取决于我感兴趣的圆圈的检测(圆圈的半径和形状因切片而异,因为它代表心脏运动)。 为此,我正在尝试:
- 找到所有检测到的圆的中心。
- 获取所有圆心的平均值。
这种方法的问题在于: 检测到的圆圈远离我的兴趣点,这会影响平均值 badly.As 您可以在 图片下码.
是否有任何解决方案(无需详尽计算协方差矩阵)来排除这个极端点?
#============================================
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
#--------------------------------------------
解决方案是拍摄 4D 图像(3D + 时间)并使用标准偏差来定位心脏(因为它一直在移动)。