SciKit-преобразование изображения

Здравствуйте, у меня есть вопрос относительно модуля преобразования изображений sciKit:

Я пытаюсь найти оптимальные параметры преобразования, которые сделают мои изображения плоскими. Допустимо до кубического преобразования, т.е. 20 параметров. Мне нужно начальное предположение для моего полинома третьего порядка, которое должно быть выведено из уже полученного полинома 2-го порядка. Однако у меня возникают проблемы с пониманием того, какие параметры назначаются где:

import numpy as np
import matplotlib.pyplot as plt
from skimage.transform import warp
from skimage.transform import AffineTransform
from skimage.transform import PolynomialTransform

def polynomialTransform(a0,a1,a2,a3,a4,a5,b0,b1,b2,b3,b4,b5):    
    array = np.zeros((2,6))
    array[0][0] = a0
    array[0][1] = a1
    array[0][2] = a2
    array[0][3] = a3
    array[0][4] = a4
    array[0][5] = a5
    array[1][0] = b0
    array[1][1] = b1
    array[1][2] = b2
    array[1][3] = b3
    array[1][4] = b4
    array[1][5] = b5
    return(PolynomialTransform(array))

def polynomialTransform2(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9):    
    array = np.zeros((2,10))
    array[0][0] = a0
    array[0][1] = a1
    array[0][2] = a2
    array[0][3] = a3
    array[0][4] = a4
    array[0][5] = a5
    array[0][2] = a6
    array[0][3] = a7
    array[0][4] = a8
    array[0][5] = a9
    array[1][0] = b0
    array[1][1] = b1
    array[1][2] = b2
    array[1][3] = b3
    array[1][4] = b4
    array[1][5] = b5
    array[1][2] = b6
    array[1][3] = b7
    array[1][4] = b8
    array[1][5] = b9
    return(PolynomialTransform(array))

Теперь я пытаюсь понять, какие параметры из 2-го порядка соответствуют каким коэффициентам в полиноме 3-го порядка. Я провел несколько тестов:

    def doTransfrom(cubeROI):  #Enter any image in the format of an n*m numpy array
        x0 = np.asarray([1,1,0,0,0,0,0,0,1,1,1,1])

        pCubic = np.asarray([1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1])

        quadratic=warp(cubeROI,polynomialTransform(x0[0],x0[1],x0[2],x0[3],x0[4],x0[5],x0[6],x0[7],x0[8],x0[9],x0[10],x0[11]))

        cubic=warp(cubeROI,polynomialTransform2(pCubic[0],pCubic[1],pCubic[2],pCubic[3],pCubic[4],pCubic[5],pCubic[6],pCubic[7],pCubic[8],pCubic[9],pCubic[10],pCubic[11],pCubic[12],pCubic[13],pCubic[14],pCubic[15],pCubic[16],pCubic[17],pCubic[18],pCubic[19]))


        plt.imshow(quadratic)
        plt.show()
        plt.imshow(cubic)
        plt.show()

Как видите, первые 2 и последние 4 параметра соответствуют друг другу... Однако я изо всех сил пытаюсь выяснить 5 параметров, оставшихся от квадратичного преобразования. На самом деле у меня такое ощущение, что ни один из параметров, следующих после 'a1', ничего не делает - Таким образом, я считаю, что моя проблема возникает из-за того, как я передаю свои an/bn в PolynomialTrasnsform! Что я делаю не так?!

Что я действительно пытаюсь сделать: Для лучшего понимания - я пытаюсь найти систему координат, для которой отличие набора изображений от его медианы минимально:

min_(an,bn): chi^2 = (Delta - I(f(x,y,a_n,b_n))^2

Квадратное преобразование Кубическое преобразование


person Sebastiano1991    schedule 30.11.2016    source источник
comment
Какое преобразование координат вас интересует? И как будет выглядеть успешно деформированное изображение? Можете пояснить описание отличия набора изображений от его медианы? Возможно, вы пытаетесь зарегистрировать изображения?   -  person Stefan van der Walt    schedule 30.11.2016
comment
Привет, Стефан, у меня есть набор из 200 астрономических изображений, которые вычитаются из срединного изображения: пиксель (i, j)_median = median (все пиксели (i, j)), которые показывают небольшое искажение. Я хочу сгладить их с помощью преобразования координат: поэтому я ищу оптимальные (в смысле хи ** 2) коэффициенты преобразования координат a_n, b_n. Что я делаю, так это минимизирую метод наименьших квадратов (Median-wrap(Image_N,polytransform)). Поскольку это требует числовой точной настройки, я начинаю с полигона 1-го порядка, передаю подогнанные a_n,b_n в функцию подбора 2-го порядка, а затем передаю эти значения в 3-й порядок. Но я решил свою проблему!   -  person Sebastiano1991    schedule 30.11.2016


Ответы (1)


Здравствуйте, я решил свою проблему:

Если передать параметры преобразования a_n, b_n, как я их определил, правильная сортировка:

Поли 2-го порядка:

[a0,a1,a2,a3,a4,a5,b0,b1,b2,b3,b4,b5]

Поли 3-го порядка:

[a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9]

Значения, которые нужно наследовать от полинома 2-го порядка к 3-му, обозначаются вторым индексом, который является порядком полинома 2-го порядка, например. а00(3-й порядок) = а0(2-й порядок):

начальное предположение для полинома 3-го порядка:

[a00,a11,a2,a3,a4,a5,a62,a73,a84,a95,b00,b11,b2,b3,b4,b5,b62,b73,b84,b95]
person Sebastiano1991    schedule 30.11.2016
comment
Кстати, вам почти никогда не нужно перечислять такие параметры. Вы можете преобразовать 2D-массив в 1D-массив: np.ravel(x), и вы можете передать несколько параметров в функцию Python с помощью: my_func(*params). - person Stefan van der Walt; 02.12.2016
comment
Хорошо, если я не подаю массив формы (2,n), polyTransform жалуется: pCubic = np.asarray([0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0]) p = PolynomialTransform(pCubic) >>> raise ValueError("invalid shape of transformation parameters") ValueError: invalid shape of transformation parameters Эта логика швов, как в документах scimage: skimage.transform.PolynomialTransform(params=None) params : (2, N) array - person Sebastiano1991; 02.12.2016