Пошук симетричних областей / візерунків у зображенні


14

У мене є набір зображень, що представляють середню кривизну задньої поверхні людини.

Що я хочу зробити, це "сканувати" зображення на точки, які мають подібні, відображені "аналоги" в іншій частині зображення (швидше за все, симетричні середній лінії, але не обов'язково, оскільки можуть бути деформації). Деякі методи зшивання зображень використовують це для "автоматичного виявлення" подібних точок між зображеннями, але я хочу виявити їх для обох сторін одного зображення.

Кінцева мета - знайти суцільну, швидше за все вигнуту, поздовжню лінію, яка адаптивно розділяє спину на симетричні «половинки».

Зразкове зображення розміщено внизу. Зауважте, що не всі регіони симетричні (конкретно, трохи вище центру зображення, червона вертикальна "смужка" відхиляється праворуч). Цей регіон повинен отримати поганий бал, або будь-який інший, але тоді локальна симетрія визначалася б із симетричних точок, розміщених далі. У будь-якому випадку, мені доведеться адаптувати будь-який алгоритм до моєї області додатків, але те, що я прошу, - це якась кореляція / згортання / відповідність шаблону, я мушу вже щось робити, я думаю.

(EDIT: нижче є більше зображень та ще декілька пояснень)

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

РЕДАКТУВАТИ: як вимагається, я включу більш типові зображення, або добре сприйняті та проблемні. Але замість кольорових зображень вони є кольорами у відтінку сірого, так що колір безпосередньо стосується величини даних, що не трапилось із кольоровим зображенням (передбачено лише для спілкування). Хоча, здається, у сірих зображень не вистачає контрасту в порівнянні з кольоровими, градієнти даних є, і при бажанні можна вивести деякий адаптивний контраст.


1) Зображення дуже симетричного предмета:

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


2) Зображення одного і того ж предмета в інший момент. Хоча є більше "особливостей" (більше градієнтів), вона не "відчуває себе" настільки симетрично, як раніше:

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


3) Тонкий молодий предмет з опуклостями (кісткові виступи, позначені більш легкими областями) середньої лінії замість більш поширеної увігнутої середньої лінії:

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


4) Молода людина зі спинальним відхиленням, підтвердженим рентгеном (зверніть увагу на асиметрію):

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


5) Типовий "нахилений" предмет (хоча здебільшого симетричний навколо вигнутої середньої лінії і як такий не належним чином "деформований"):

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


Будь-яка допомога вітається!


Чому б просто не використати хребет як дільник?
Джим Клей

@JimClay: Я підозрюю, що хребет - це частина, яка вимірюється, відносно фактичної осі симетрії решти зображень
ендоліт

"Деякі методи зшивання зображень використовують це для" автоматичного виявлення "подібних точок між зображеннями" Зробіть відверту копію зображення, а потім використовуйте одну з них. :)
endolith

Не могли б ви просто відобразити зображення по осі Y та використовувати алгоритм реєстрації? Тому що вже існує багато досліджень гнучких / непараметричних алгоритмів реєстрації, на яких ви могли б розробитись.
Нікі Естнер

JimClay, хребет - це те, що я хочу знайти, я не знаю, де це; Ендоліт, моє запитання стосується того, щоб люди розповідали мені назви деяких алгоритмів, я ще не знайшов. І Нікі, у цьому вся суть, але я не знаю жодного з цих алгоритмів, тому я в першу чергу задаю питання: o)
heltonbiker

Відповіді:


9

Як я вже говорив у коментарях, реєстрація медичних зображень - це тема з великою кількістю досліджень, і я не є експертом. З того, що я читав, основна ідея, яка зазвичай використовується, - це визначити відображення між двома зображеннями (у вашому випадку зображення та його дзеркальним зображенням), потім визначити енергетичні терміни для гладкості та подібності зображення, якщо застосовується відображення, і нарешті оптимізувати це відображення за допомогою стандартних (або іноді конкретних прикладних) методів оптимізації.

Я зламав швидкий алгоритм в Mathematica, щоб продемонструвати це. Це не так алгоритм, який слід використовувати в медичній програмі, а лише демонстрація основних ідей.

По-перше, я завантажую ваше зображення, дзеркально його і розбиваю ці зображення на маленькі блоки:

src = ColorConvert[Import["http://i.stack.imgur.com/jf709.jpg"], 
   "Grayscale"];
mirror = ImageReflect[src, Left -> Right];
blockSize = 30;
partsS = ImagePartition[src, {blockSize, blockSize}];
partsM = ImagePartition[mirror, {blockSize, blockSize}];
GraphicsGrid[partsS]

Графіка математики

Зазвичай ми робимо приблизну жорстку реєстрацію (використовуючи, наприклад, ключові точки або моменти зображення), але ваше зображення майже в центрі, тому я пропускаю це.

Якщо ми подивимось на один блок і це аналог дзеркального зображення:

{partsS[[6, 10]], partsM[[6, 10]]}

Графіка математики

Ми можемо бачити, що вони схожі, але зміщені. Ми намагаємося з’ясувати кількість та напрямок зміни.

Для кількісної оцінки подібності відповідності я можу використовувати евклідову відстань у квадраті:

ListPlot3D[
  ImageData[
   ImageCorrelate[partsM[[6, 10]], partsS[[6, 10]], 
    SquaredEuclideanDistance]]]

Графіка математики

На жаль, використовувати ці дані - оптимізація безпосередньо була складніше, ніж я думав, тому я застосував наближення 2-го порядку:

fitTerms = {1, x, x^2, y, y^2, x*y};

fit = Fit[
   Flatten[MapIndexed[{#2[[1]] - blockSize/2, #2[[2]] - 
        blockSize/2, #1} &, 
     ImageData[
      ImageCorrelate[partsM[[6, 10]], partsS[[6, 10]], 
       SquaredEuclideanDistance]], {2}], 1], fitTerms, {x, y}];

Plot3D[fit, {x, -25, 25}, {y, -25, 25}]

Графіка математики

Функція не така, як фактична функція кореляції, але вона досить близька для першого кроку. Розрахуємо це для кожної пари блоків:

distancesFit = MapThread[
   Function[{part, template},
    Fit[Flatten[
      MapIndexed[{#2[[2]] - blockSize/2, #2[[1]] - blockSize/2, #1} &,
        ImageData[
        ImageCorrelate[part, template, 
         SquaredEuclideanDistance]], {2}], 1], 
     fitTerms, {x, y}]], {partsM, partsS}, 2];

Це дає нам перший енергетичний термін для оптимізації:

variablesX = Array[dx, Dimensions[partsS]];
variablesY = Array[dy, Dimensions[partsS]];

matchEnergyFit = 
  Total[MapThread[#1 /. {x -> #2, y -> #3} &, {distancesFit, 
     variablesX, variablesY}, 2], 3];

variablesX/Y містить компенсації для кожного блоку та matchEnergyFit наближає різну евклідову різницю між початковим зображенням та дзеркальним зображенням із застосованими зрушеннями.

Оптимізація однієї цієї енергії дала б погані результати (якщо вона взагалі сходилася). Ми також хочемо, щоб компенсації були плавними, коли схожість блоку не означає нічого про зміщення (наприклад, по прямій лінії або на білому тлі).

Отже, ми створили другий енергетичний термін для плавності:

smoothnessEnergy = Total[Flatten[
    {
     Table[
      variablesX[[i, j - 1]] - 2 variablesX[[i, j]] + 
       variablesX[[i, j + 1]], {i, 1, Length[partsS]}, {j, 2, 
       Length[partsS[[1]]] - 1}],
     Table[
      variablesX[[i - 1, j]] - 2 variablesX[[i, j]] + 
       variablesX[[i + 1, j]], {i, 2, Length[partsS] - 1}, {j, 1, 
       Length[partsS[[1]]]}],
     Table[
      variablesY[[i, j - 1]] - 2 variablesY[[i, j]] + 
       variablesY[[i, j + 1]], {i, 1, Length[partsS]}, {j, 2, 
       Length[partsS[[1]]] - 1}],
     Table[
      variablesY[[i - 1, j]] - 2 variablesY[[i, j]] + 
       variablesY[[i + 1, j]], {i, 2, Length[partsS] - 1}, {j, 1, 
       Length[partsS[[1]]]}]
     }^2]];

На щастя, в Mathematica вбудована обмежена оптимізація:

allVariables = Flatten[{variablesX, variablesY}];
constraints = -blockSize/3. < # < blockSize/3. & /@ allVariables;
initialValues = {#, 0} & /@ allVariables;
solution = 
  FindMinimum[{matchEnergyFit + 0.1 smoothnessEnergy, constraints}, 
   initialValues];

Давайте подивимось на результат:

grid = Table[{(j - 0.5)*blockSize - dx[i, j], (i - 0.5)*blockSize - 
      dy[i, j]}, {i, Length[partsS]}, {j, Length[partsS[[1]]]}] /. 
   solution[[2]];
Show[src, Graphics[
  {Red,
   Line /@ grid,
   Line /@ Transpose[grid]
   }]]

Графіка математики

Попередній 0.1коефіцієнт smoothnessEnergy- відносна вага енергії гладкості, яку отримує залежно від терміна енергії відповідності зображення. Це результати для різної ваги:

Графіка математики

Можливі вдосконалення:

  • Як я вже сказав, спочатку проведіть жорстку реєстрацію. З білим тлом реєстрація на основі простих зображень повинна працювати чудово.
  • Це лише один крок. Ви можете використовувати компенсації, знайдені за один крок, та вдосконалити їх на другому кроці, можливо, за допомогою меншого вікна пошуку чи менших розмірів блоків
  • Я читав статті, де вони взагалі роблять це без блоків, але оптимізують зміщення на піксель.
  • Спробуйте різні функції гладкості

відповідь занадто довгий, щоб читати просто для задоволення, але остаточне зображення є досить показовим: воно виглядає дивовижно: D
пенелопа

Ця відповідь була дуже просвітницькою. Мені знадобиться певний час, щоб проковтнути його, але, швидше за все, мені потрібно використовувати нежорстку техніку реєстрації. На щастя, ви надали деякі концептуальні деталі, тож у гіршому випадку я можу визначити якийсь подібний підхід. Тим часом я оновлю питання ще більше зображень. Дякую зараз!
heltonbiker

4

Цікаве запитання. По-перше, можливо, ви користуєтеся підходами, заснованими на детекторі ключових точок інтересу та відповідності. Сюди входить SIFT (масштабно-інваріантна трансформація функцій), SURF, ORB тощо ... або навіть більш простий підхід, заснований виключно на операторі Харріса (csce.uark.edu/~jgauch/library/Features/Harris.1988.pdf ). З вашого поста незрозуміло, що ви спробували, тому мені шкода, якщо я тут наївся.

Сказав, що, дозвольте скористатись більш простим підходом із Математичної морфології (ММ) просто для задоволення :) Зображення для візуалізації всіх етапів закінчуються.

Я взяв ваше зразкове зображення і перетворив його у кольоровий простір L a b * за допомогою ImageMagick і використав лише смугу L *:

convert x.jpg -colorspace Lab -separate %d.png

0.png відповідає смузі L *. Тепер я впевнений, що у вас є фактичні дані зображення, але я маю справу з артефактами стиснення jpg і чим ні. Щоб частково вирішити цю проблему, я здійснив морфологічне відкриття з подальшим морфологічним закриттям плоским диском радіусу 5. Це основний спосіб зменшення шуму з ММ, і, враховуючи радіус диска, велика частина зображення не змінюється. Далі моя ідея була заснована на цьому єдиному образі, який має великі шанси провалитися в інших випадках. Ваша область інтересу візуально відрізняється тим, що темніша ("гарячіша" у вашому кольоровому зображенні), тому я вважаю, що бінабілізатор, що базується на статистиці, може добре працювати. Я використав підхід Оцу, який є автоматичним.

На цьому етапі можна чітко уявити центральний регіон, що цікавить. Проблема полягає в тому, що, на моєму підході, я хотів, щоб це була закрита складова, але це не так. Почніть з відкидання кожного підключеного компонента, який є меншим за найбільший (не рахуючи фону як одного з них). Це має більший шанс працювати в інших випадках, якщо результат бінаризації був хорошим. У вашому прикладі зображення є один компонент, підключений до фону, тому він не відкидається, але це не спричиняє проблем.

Якщо ви все ще стежите за мною, ми ще не знайдемо фактичного передбачуваного центрального регіону, що цікавить. Ось мій погляд на це. Якою б вигнутою людина не була (насправді я бачу певні проблемні випадки), регіон нагадує вертикальну лінію. З цією метою я спрощую поточне зображення, виконуючи морфологічний отвір вертикальною лінією довжиною 100. Ця довжина є чисто довільною, якщо у вас немає проблем із масштабуванням, то це не важке значення для визначення. Тепер ми знову відкидаємо компоненти, але я був трохи обережнішим на цьому кроці. Я використовував відкриття за площею із доповненням зображення, щоб відкинути те, що я вважав невеликими регіонами, це можна було зробити більш контрольованим способом, виконавши щось у вигляді гранулометричного аналізу (також від ММ).

Зараз у нас приблизно три частини: ліва частина зображення, центральна частина та права частина зображення. Очікується, що центральна частина буде меншою складовою з трьох, тому вона виходить тривіально.

Ось кінцевий результат, зображення внизу праворуч - це лише накладене зображення ліворуч від оригінального. Окремі фігури не всі вирівняні, шкода поспіху.

http://i.imgur.com/XRhYv.png


Дякую вам дуже за ваш добрий інтерес, але ваш підхід повинен враховувати певні властивості моїх даних (не скарга, а лише деталізація): 1) Фактичні дані - це двовимірний масив поплавків, кольоровий з розбіжним червоно-жовтим кольором, зелена кольорова карта в матплотлібі Python. Я не думаю, що робота з кольоровими даними була б концептуально правильною, зображення показано лише для комунікаційних цілей; 2) Фактичні дані стосуються кривизни поверхні (опукла проти увігнутої), червоні частини - увігнуті, а зелені - опуклі. Симетрична вісь не обов'язково потрапляє увігнуту область.
heltonbiker

Я дуже скоро додаю ще кілька зображень (і заміню це) на відтінки сірого, щоб самі зображення можна було використати для тестування, усуваючи небезпеку спотворення динамічного діапазону через колір.
heltonbiker

На жаль, дані поки що недоступні. Зображення сірого кольору в кращому випадку є його наближенням.
mmgp

Я вважаю, що наближення, швидше за все, достатньо, але я не проти надати фактичні дані. Я можу розмістити деякі публічні посилання для завантаження DropBox, просто не знаю, у якому форматі файлу.
heltonbiker
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.