Как найти оптимальное перекрытие шумных бивалентных матриц - PullRequest
1 голос
/ 06 марта 2011

Я имею дело с проблемой обработки изображений, которую я упростил следующим образом. У меня есть три матрицы 10x10, каждая со значениями 1 или -1 в каждой ячейке. Каждая матрица имеет неправильный объект, расположенный где-то , и в матрице есть некоторый шум. Я хотел бы выяснить, как найти оптимальное выравнивание матриц, которое позволило бы мне выровнять объекты, чтобы я мог получить их среднее значение.

С кодированием 1 / -1 я знаю, что произведение двух матриц (используя поэлементное умножение, а не умножение матриц) даст 1, если есть совпадение между двумя умноженными ячейками, и -1, если есть несоответствие таким образом, сумма произведений дает меру перекрытия. С этим я знаю, что могу попробовать все возможные выравнивания двух матриц, чтобы найти то, что дает оптимальное перекрытие, но я не уверен, как это сделать с 3 матрицами (или более - у меня действительно 20+ в моих фактических данных набор).

Чтобы прояснить проблему, вот некоторый код, написанный на R, который устанавливает вид матриц, с которыми я имею дело:

#set up the 3 matricies
m1 = c(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1)
m1 = matrix(m1,10)

m2 = c(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1)
m2 = matrix(m2,10)

m3 = c(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1)
m3 = matrix(m3,10)

#show the matricies
image(m1)
image(m2)
image(m3)
#notice there's a "+" shaped object in each

#create noise
set.seed(1)
n1 = sample(c(1,-1),100,replace=T,prob=c(.95,.05))
n1 = matrix(n1,10)
n2 = sample(c(1,-1),100,replace=T,prob=c(.95,.05))
n2 = matrix(n2,10)
n3 = sample(c(1,-1),100,replace=T,prob=c(.95,.05))
n3 = matrix(n3,10)

#add noise to the matricies
mn1 = m1*n1
mn2 = m2*n2
mn3 = m3*n3

#show the noisy matricies
image(mn1)
image(mn2)
image(mn3)

1 Ответ

1 голос
/ 07 марта 2011

Вот программа на Mathematica, которая делает то, что вы хотите (я думаю).

Я могу объяснить это более подробно, если вам нужно.

(*define temp tables*)
r = m = Table[{}, {100}];
(*define noise function*)
noise := Partition[RandomVariate[BinomialDistribution[1, .05], 100], 
   10];
For[i = 1, i <= 100, i++,
 (*generate 100 10x10 matrices with the random cross and noise added*)
 w = RandomInteger[6]; h = w = RandomInteger[6];
 m[[i]] = (ArrayPad[CrossMatrix[4, 4], {{w, 6 - w}, {h, 6 - h}}] + 
     noise) /. 2 -> 1;

 (*Select connected components in each matrix and keep only the biggest*)
 id = Last@
   Commonest[
    Flatten@(mf = 
       MorphologicalComponents[m[[i]], CornerNeighbors -> False]), 2];
 d = mf /. {id -> x, x_Integer -> 0} /. {x -> 1};
 {minX, maxX, minY, maxY} =
  {Min@Thread[g[#]] /. g -> First,
     Max@Thread[g[#]] /. g -> First,
     Min@Thread[g[#]] /. g -> Last,
     Max@Thread[g[#]] /. g -> Last} &@Position[d, 1];

 (*Trim the image of the biggest component *)
 r[[i]] = d[[minX ;; maxX, minY ;; maxY]];
 ]
(*As the noise is low, the more repeated component is the image*)
MatrixPlot @@ Commonest@r  

Результат:

enter image description here

...