Вибачте, я не знаю OpenCV, і це скоріше крок попередньої обробки, ніж повна відповідь:
По-перше, ви не хочете детектор краю. Крайовий детектор перетворює переходи (як цей темний-світлий):
у хребти (яскраві темні лінії):
Він виконує диференціацію, іншими словами.
Але у ваших образах є світло, що сяє вниз з одного напрямку, що показує нам рельєф 3D-поверхні. Ми сприймаємо це як лінії та ребра, тому що ми звикли бачити речі в 3D, але насправді вони не є, через що детектори країв не працюють, а відповідність шаблонів не працюватиме легко з обернутими зображеннями (ідеально матч при 0 градусах обертання фактично повністю скасується при 180 градусах, тому що світлі та темні будуть вирівнюватися між собою).
Якщо висота однієї з цих затишних ліній виглядає так збоку:
тоді функція яскравості при освітленні з одного боку буде виглядати так:
Це ви бачите на своїх зображеннях. Лицьова поверхня стає яскравішою, а поверхня стає темнішою. Тож ви не хочете розмежовуватись. Потрібно інтегрувати зображення вздовж напрямку освітлення, і воно дасть вам оригінальну карту висоти поверхні (приблизно). Тоді буде простіше зіставляти речі, будь то через трансформацію Хаффа чи відповідність шаблонів чи будь-що інше.
Я не впевнений, як автоматизувати пошук напрямку освітлення. Якщо це однаково для всіх ваших образів, чудово. Інакше вам доведеться знайти найбільшу лінію контрасту і припустити, що світло перпендикулярно до нього чи чогось іншого. Для мого прикладу я повернув зображення вручну в потрібному напрямку, зліва зліва:
Також потрібно усунути всі низькочастотні зміни зображення, щоб виділити лише швидкозмінні функції, що швидко змінюються. Щоб уникнути дзвінка артефактів, я використав 2D гауссова розмиття, а потім відніс це з оригіналу:
Інтеграція (сукупна сума) може легко втекти, що створює горизонтальні смуги. Я видалив їх іншим Гауссовим високопрохідним, але цього разу лише в горизонтальному напрямку:
Тепер продихи - це білі еліпси навколо, замість білих в одних місцях і чорних в інших.
Оригінал:
Інтегрований:
from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d
filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)
# Remove DC offset
I = I - average(I)
close('all')
figure()
imshow(I)
gray()
show()
title('Original')
# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)
figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)
# Integrate
summed = cumsum(I, 1)
# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)
figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)
Перетворення жижки може бути використаний для виявлення коньковие еліпси , як це, зробив з «крайових пікселів», хоча це дуже дорого в обчисленнях і пам'яті, і вони не є досконалими еліпси , так що повинно було б бути трохи «неакуратне» детектора. Я ніколи цього не робив, але є дуже багато результатів Google для " виявлення епіграфа Хонг ". Я б сказав, якщо ви виявите один еліпс всередині іншого, в певному просторі пошуку розміру, це слід вважати стомою.
Також дивіться: