Я пытаюсь внедрить FRST на python для обнаружения центроидов эллиптических объектов (например, клеток на микроскопических изображениях), но моя реализация не находит начальные точки (более или менее центральные точки) эллиптических объектов.Это усилие происходит из-за дублирования FRST из Сегментации перекрывающихся эллиптических объектов на изображениях силуэтов (https://ieeexplore.ieee.org/document/7300433).. Я не знаю, почему у меня есть эти артефакты. Интересно то, что я вижу эти шаблоны (крестики) все в одном направлении для каждого объекта. Любая точка в правильном направлении для получения того же результата, что и на бумаге (просто для того, чтобы найти начальные точки), будет очень кстати.
Оригинальная бумага: AБыстрое преобразование радиальной симметрии для обнаружения интересных мест . Автор: Loy and Zelinsky (ECCV 2002)
Я также пробовал уже существующий пакет python для FRST: https://pypi.org/project/frst/. Это как-то приводит кТе же артефакты. Странно.
- Первое изображение: Исходное изображение
- Второе изображение: Управляемое Собелем изображение
- Третье изображение: Величина проецируемого изображения
- Четвертое изображение: проекционная величина изображения только с положительно затронутыми пикселями
- Пятое изображение: FRST-изображение: конечный продукт с наложением исходного изображения(затенено)
- Шестое изображение: FRST-изображение ранее существовавшего пакета Python с наложенным исходным изображением (затенено).
![Sobel-operated Image](https://i.stack.imgur.com/og6rk.png)
![FRST pre-existing python package](https://i.stack.imgur.com/CeSbJ.png)
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