В іншому місці користувач1149913 надає чудові поради (визначте ймовірнісну модель) та код для потужного підходу (оцінка ЕМ). Залишається вирішити два питання:
Як впоратися з відхиленнями від імовірнісної моделі (які дуже очевидні в даних 2011-2012 рр. І дещо очевидні в коливаннях менш нахилених точок).
Як визначити хороші вихідні значення для алгоритму ЕМ (або будь-якого іншого алгоритму).
Щоб вирішити номер 2, подумайте про перетворення Хаффа . Це алгоритм виявлення особливостей, який для знаходження лінійних розтяжок функцій може ефективно обчислюватися як перетворення Радона .
хух , ув перетворенні Хоф. Коли риси оригінальної ділянки падають на загальну лінію або достатньо близьку до одиниці, то колекції кривих, які вони виробляють у перетворенні Хоуфа, мають звичайний перетин, відповідний цій загальній лінії. Виявивши ці точки найбільшої інтенсивності в перетворенні Хоффа, ми можемо прочитати хороші рішення вихідної проблеми.
Для початку з цими даними я спершу обрізав допоміжний матеріал (оси, галочки та мітки) і для гарної міри обрізав очевидно зовнішні точки в правій нижній частині і посипав уздовж нижньої осі. (Коли цей матеріал не обрізаний, процедура все ще працює добре, але він також виявляє осі, рамки, лінійні послідовності кліщів, лінійні послідовності міток і навіть точки, що спорадично лежать на нижній осі!)
img = Import["http://i.stack.imgur.com/SkEm3.png"]
i = ColorNegate[Binarize[img]]
crop2 = ImageCrop[ImageCrop[i, {694, 531}, {Left, Bottom}], {565, 467}, {Right, Top}]
(Цей та решта коду є у Mathematica .)
Кожній крапці на цьому зображенні відповідає вузький діапазон кривих у перетворенні Хоффа, видно тут. Вони є синусоїдами:
hough2 = Radon[crop2, Method -> "Hough"] // ImageAdjust
Це дає візуально виявити сенс, у якому питання є проблемою кластеризації рядків : перетворення Хаффа зводить її до проблеми кластеризації точок , до якої ми можемо застосувати будь-який метод кластеризації, який нам подобається.
У цьому випадку кластеризація є настільки зрозумілою, що досить простої післяобробки перетворення Хоуфа. Щоб визначити місця найбільшої інтенсивності в перетворенні, я збільшив контраст і розмив перетворення в радіусі близько 1%: це порівнянно з діаметрами точок сюжету на вихідному зображенні.
blur = ImageAdjust[Blur[ImageAdjust[hough2, {1, 0}], 8]]
Результат порогу звузив його до двох крихітних крапель, центроїди яких обґрунтовано ототожнюють точки найбільшої інтенсивності: вони оцінюють відповідні лінії.
comp = MorphologicalComponents[blur, 0.777]) // Colorize
0,777
Ліва частина зображення відповідає напрямку 0 градусів (горизонтальному), і, коли ми дивимось зліва направо, цей кут лінійно збільшується до 180 градусів. Інтерполюючи, я обчислюю, що дві краплі зосереджені відповідно на 19 і 57,1 градуса. Ми також можемо зчитувати перехоплення з вертикальних позицій краплі. Ця інформація дає початкові результати:
width = ImageDimensions[blur][[1]];
slopes = Module[{x, y, z}, ComponentMeasurements[comp, "Centroid"] /.
Rule[x_, {y_, z_}] :> Round[((y - 1/2)/(width - 1)) 180., 0.1]
]
{19., 57.1}
Аналогічним чином можна обчислити перехоплення, відповідні цим нахилам, надаючи ці підходи:
(Червона лінія відповідає крихітній рожевій крапці на попередньому малюнку, а синя лінія - більшій аква-крап.)
Значною мірою цей підхід автоматично вирішив перше питання: відхилення від лінійності розмивають точки найбільшої інтенсивності, але, як правило, не сильно їх зміщують. Відверто навколишні точки сприятимуть шуму низького рівня протягом усієї трансформації Хоф, який зникне під час процедур після обробки.
На цьому етапі можна надати ці оцінки як вихідні значення для алгоритму ЕМ або як мінімізатор ймовірності (який, даючи хороші оцінки, швидко сходиться). Краще, однак, було б використовувати надійний оцінювач регресії, такий як ітеративно переосмислені найменші квадрати . Він здатний надати вагу регресії до кожної точки. Невеликі ваги вказують, що точка не "належить" до лінії. Використовуйте ці ваги, за бажанням, щоб призначити кожну точку відповідної лінії. Потім, класифікувавши точки, ви можете використовувати звичайні найменші квадрати (або будь-яку іншу процедуру регресії) окремо на дві групи точок.