Я читал Programming Computer Vision with Python Яна Эрика Солема, довольно хорошую книгу. , однако я не смог прояснить вопрос о регистрации изображения.
По сути, у нас есть куча изображений (лиц), которые нужно немного выровнять, поэтому первое, что необходимо, — это выполнить жесткое преобразование через преобразование подобия:
x' = | sR t | x
| 0 1 |
где x — это вектор (в данном случае набор координат), который нужно преобразовать в x' посредством поворота R, переноса t и, возможно, масштабирования s.
Solem вычисляет это жесткое преобразование для каждого изображения, которое возвращает матрицу вращения R и вектор смещения как tx и ty:
R,tx,ty = compute_rigid_transform(refpoints, points)
Однако по какой-то причине он переупорядочивает элементы R:
T = array([[R[1][1], R[1][0]], [R[0][1], R[0][0]]])
а позже он выполняет аффинное преобразование:
im2[:,:,i] = ndimage.affine_transform(im[:,:,i],linalg.inv(T),offset=[-ty,-tx])
В этом примере это аффинное преобразование выполняется для каждого канала, но это не имеет значения. im[:,:,i]
— это изображение, которое нужно обработать, и эта процедура возвращает другое изображение.
Что такое T
и почему мы инвертируем эту матрицу в аффинном преобразовании? И каковы обычные шаги для достижения регистрации изображения?
Обновлять
Здесь вы можете найти соответствующую часть этого кода в Google Книгах. Начинается внизу страницы 67.
T
кажется просто транспонированиемR
, что для матрицы вращения совпадает с инверсией. Затем он выполняет инверсию (снова) в вызовеndimage.affine_transform
. Я думаю, что этой функции должно быть передано либоT
, либоlinalg.inv(R)
. - person aganders3   schedule 20.10.2012T
- это не просто транспонированиеR
. Сейчас я запутался больше, чем когда-либо. Вы пробовали запустить этот код? - person aganders3   schedule 20.10.2012