Имена функций EBImage

Кто-нибудь может объяснить, что используется для вычисления различных функций в computeFeatures?

Я получаю применяемое соглашение об именах, изложенное в ? computeFeatures. Я не понимаю ярлыки .0., .a. и .Ba..

Например:

> library(EBImage)
> y = readImage(system.file("images", "nuclei.tif", package="EBImage"))[,,1]
> x = thresh(y, 10, 10, 0.05)
> x = opening(x, makeBrush(5, shape='disc'))
> x = bwlabel(x)
> ft = computeFeatures(x, y, xname="nucleus")
> colnames(ft)
 [1] "nucleus.0.m.cx"            "nucleus.0.m.cy"           
 [3] "nucleus.0.m.majoraxis"     "nucleus.0.m.eccentricity" 
<snip>
[11] "nucleus.0.s.radius.max"    "nucleus.a.b.mean"         
[13] "nucleus.a.b.sd"            "nucleus.a.b.mad"          
<snip>
[51] "nucleus.Ba.b.mean"         "nucleus.Ba.b.sd"          
[53] "nucleus.Ba.b.mad"          "nucleus.Ba.b.q001"        
[55] "nucleus.Ba.b.q005"         "nucleus.Ba.b.q05"  
<snip>       

Я предполагаю, что функции nucleus.0.* используют только данные из двоичных масок, содержащихся в x. Таким образом, nucleus.0.m.cy — это центроид оси Y, вычисленный с использованием двоичных данных. Есть также nucleus.a.m.cy и nucleus.Ba.m.cy, но неясно, чем отличаются эти вычисления (они чрезвычайно коррелированы, но не идентичны).

Я также предполагаю, что .a. и .Ba. используют значения интенсивности в y, но детали расплывчаты. Такие функции, как nucleus.a.b.mean и nucleus.Ba.b.mean, похожи (корр. ~.80), но не одинаковы. Я предполагаю, что они оценивают среднюю y интенсивность объектов, определяемых метками в x, но разница неясна.

Есть ли документация по этому поводу?

Спасибо,

Максимум

> sessionInfo()
R Under development (unstable) (2014-08-23 r66461)
Platform: x86_64-apple-darwin10.8.0 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] EBImage_4.7.16

loaded via a namespace (and not attached):
 [1] abind_1.4-0         BiocGenerics_0.11.4 grid_3.2.0         
 [4] jpeg_0.1-8          lattice_0.20-29     locfit_1.5-9.1     
 [7] parallel_3.2.0      png_0.1-7           tiff_0.1-5         
[10] tools_3.2.0  

person topepo    schedule 21.09.2014    source источник


Ответы (2)


Вы видели документацию здесь: AnalysisWithEBImage

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

person mattbawn    schedule 24.09.2014
comment
У меня есть, но 1) многие из этого конкретного синтаксиса устарели и 2) он не упоминает computeFeatures. Я хотел задать вопрос здесь, прежде чем беспокоить сопровождающего пакета (как я хотел бы, чтобы кто-то сделал для моих пакетов). Спасибо, Макс - person topepo; 24.09.2014

В качестве отказа от ответственности я ничего не знаю о вашей области, но, глядя на функцию, я могу довольно хорошо предположить, что происходит. Я рекомендую вам использовать debugonce(computeFeatures), а затем запустить ft = computeFeatures(x, y, xname="nucleus"). Вы можете просмотреть каждую строку кода (введите Q), чтобы выйти, и посмотреть, что происходит.

Как вы заметили, в документации указано:

Элементы называются x.y.f, где x — слой объекта, y — слой эталонного изображения, а f — имя элемента.

В вашем примере computeFeatures сгенерировал значения для трех эталонных слоев (a, aB и 0). В документации упоминается, что если вы не назовете свои эталонные слои, им будут присвоены только буквы алфавита, поэтому в вашем случае у вас был один эталонный слой, и он называется a. Я полагаю, что 0 означает, что он не использует опорный слой нет.

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

# Hard code a filter
blob = gblob(x0 = 15, n = 49, alpha = 0.8, beta = 1.2)
# Filter using the fast 2D FFT convolution product.
bref = lapply(ref, function(r) filter2(r, blob)/2)
# Name it "B" and then the layer name
names(bref) = paste("B", names(ref), sep = "")

Я не знаю точно, что вы пытаетесь здесь сделать, но вы можете визуально увидеть, что делает этот фильтр. Вот ваш x (вы можете просто запустить display(x), чтобы увидеть его):

введите здесь описание изображения

Вот ваша ссылка (y):

введите здесь описание изображения

Вот как выглядит жестко закодированный фильтр:

введите здесь описание изображения

А вот что жестко запрограммированный фильтр делает с y:

введите здесь описание изображения

Итак, подведем итог: все, что имеет 0, сравнивается с отсутствием ссылки, все, что имеет a, сравнивается напрямую с y как ссылкой, а все, что имеет aB, сравнивается с отфильтрованной версией y.

person nograpes    schedule 24.09.2014
comment
Прочитав немного больше об этом, я подозреваю, что жестко закодированный фильтр применяет 15-пиксельное размытие по Гауссу., что было бы полезно, если бы вам нужно было определить границы. - person nograpes; 24.09.2014
comment
Я знаю, что пытается сделать код, но я ищу более подробную информацию о точных деталях того, какие данные используются для вычисления функций относительно соглашения об именах. Здесь только 1 эталонный объект (y); для более чем одного ссылочного объекта потребуется список матриц (и для данного примера использование более одного значения в reframes вызывает ошибку). Если я использую что-то вроде refnames = "prot", соглашение становится .prot. и .Bprot. вместо .a. и .Ba, что немного более определено, но не объясняет вычисления. - person topepo; 24.09.2014
comment
Хотя вы вводите только один эталонный объект (y), он создает два эталонных объекта для каждого введенного вами эталонного объекта, один как вы ввели, а другой с размытием по Гауссу. Как я уже упоминал, перед размытием по Гауссу всегда ставится префикс B. Точное размытие, которое он использует, также указано в приведенном выше коде. Наконец, он добавляет третью ссылку, называемую 0, которая не использует ссылку. - person nograpes; 25.09.2014