Реализация быстрого радиального преобразования симметрии (FRST) (python) приводит к необычным артефактам, выглядящим перекрестно - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь внедрить FRST на python для обнаружения центроидов эллиптических объектов (например, клеток на микроскопических изображениях), но моя реализация не находит начальные точки (более или менее центральные точки) эллиптических объектов.Это усилие происходит из-за дублирования FRST из Сегментации перекрывающихся эллиптических объектов на изображениях силуэтов (https://ieeexplore.ieee.org/document/7300433).. Я не знаю, почему у меня есть эти артефакты. Интересно то, что я вижу эти шаблоны (крестики) все в одном направлении для каждого объекта. Любая точка в правильном направлении для получения того же результата, что и на бумаге (просто для того, чтобы найти начальные точки), будет очень кстати.

Оригинальная бумага: AБыстрое преобразование радиальной симметрии для обнаружения интересных мест . Автор: Loy and Zelinsky (ECCV 2002)

Я также пробовал уже существующий пакет python для FRST: https://pypi.org/project/frst/. Это как-то приводит кТе же артефакты. Странно.

  1. Первое изображение: Исходное изображение
  2. Второе изображение: Управляемое Собелем изображение
  3. Третье изображение: Величина проецируемого изображения
  4. Четвертое изображение: проекционная величина изображения только с положительно затронутыми пикселями
  5. Пятое изображение: FRST-изображение: конечный продукт с наложением исходного изображения(затенено)
  6. Шестое изображение: FRST-изображение ранее существовавшего пакета Python с наложенным исходным изображением (затенено).

Original Image Sobel-operated Image
Magnitude Projection Image Magnitude Projection Image with positively affected pixels only FRST'd image: end-product with original image overlaid (shadowed) FRST pre-existing python package

from scipy.ndimage import gaussian_filter
import numpy as np
from scipy.signal import convolve


# Get orientation projection image
def get_proj_img(image, radius):

    workingDims = tuple((e + 2*radius) for e in image.shape)

    h,w = image.shape

    ori_img = np.zeros(workingDims) # Orientation Projection Image
    mag_img = np.zeros(workingDims) # Magnitutde Projection Image 

    # Kenels for the sobel operator 
    a1 = np.matrix([1, 2, 1])
    a2 = np.matrix([-1, 0, 1])
    Kx = a1.T * a2
    Ky = a2.T * a1

    # Apply the Sobel operator
    sobel_x = convolve(image, Kx)
    sobel_y = convolve(image, Ky)
    sobel_norms = np.hypot(sobel_x, sobel_y)

    # Distances to afpx, afpy (affected pixels)    
    dist_afpx = np.multiply(np.divide(sobel_x, sobel_norms, out = np.zeros(sobel_x.shape), where = sobel_norms!=0), radius)
    dist_afpx = np.round(dist_afpx).astype(int)

    dist_afpy = np.multiply(np.divide(sobel_y, sobel_norms, out = np.zeros(sobel_y.shape), where = sobel_norms!=0), radius)
    dist_afpy = np.round(dist_afpy).astype(int)


    for cords, sobel_norm in np.ndenumerate(sobel_norms):
        i, j = cords

        pos_aff_pix = (i+dist_afpx[i,j], j+dist_afpy[i,j])
        neg_aff_pix = (i-dist_afpx[i,j], j-dist_afpy[i,j])

        ori_img[pos_aff_pix] += 1
        ori_img[neg_aff_pix] -= 1
        mag_img[pos_aff_pix] += sobel_norm
        mag_img[neg_aff_pix] -= sobel_norm

    ori_img = ori_img[:h, :w]
    mag_img = mag_img[:h, :w]

    print ("Did it go back to the original image size? ")
    print (ori_img.shape == image.shape)

    # try normalizing ori and mag img
    return ori_img, mag_img

def get_sn(ori_img, mag_img, radius, kn, alpha):

    ori_img_limited = np.minimum(ori_img, kn)
    fn = np.multiply(np.divide(mag_img,kn), np.power((np.absolute(ori_img_limited)/kn), alpha))

    # convolute fn with gaussian filter. 
    sn = gaussian_filter(fn, 0.25*radius)

    return sn

def do_frst(image, radius, kn, alpha, ksize = 3):
    ori_img, mag_img = get_proj_img(image, radius)
    sn = get_sn(ori_img, mag_img, radius, kn, alpha)

    return sn

Параметры:

radius = 50
kn = 10
alpha = 2
beta = 0 
stdfactor = 0.25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...