Как разыменовать в питоне? (Обработка изображений с помощью openCV)

Я искал в Интернете простой алгоритм прореживания и наткнулся на это: Алгоритм прореживания Проблема в том, что у меня мало опыта с оператором разыменования. Кроме того, мой проект находится на питоне, у которого есть другой способ справиться с этой ситуацией. Итак, у меня есть несколько вопросов

1: Что делает этот кусок кода?

void myThinningInit (CvMat ** kpw, CvMat ** kpb)
  {
    / / Kernel for cvFilter2D
    / / The algorithm kpw kernel binary image and it has become a matching white, black,
    / / Convolution is divided into two sets of binary image was inverted kpb kernel, then take the AND
    for (int i = 0; i <8; i + +) {
      * (Kpw + i) = cvCreateMat (3, 3, CV_8UC1);
      * (Kpb + i) = cvCreateMat (3, 3, CV_8UC1);
      cvSet (* (kpw + i), cvRealScalar (0), NULL);
      cvSet (* (kpb + i), cvRealScalar (0), NULL);
    }.....

И 2: Как я могу перевести это создание ядра на python?

В итоге он сделал 8 ядер, но я понятия не имею, как выглядит их матричная форма. Я не понимаю, что делают "* (kpw + i)" или "* (kpb + i)" в общей схеме программы.

3) Могу ли я просто сделать ядра и хранить их в списке? Если да, то как я мог это сделать?

ОБНОВИТЬ:

k = [1, 2, 3, 5, 6, 7, 8]
kpw = []
kpb = []

for i in k:
    kpw.append [i] = cv.CreateMat (3, 3, cv.CV_8UC1)
    kpb.append [i] = cv.CreateMat (3, 3, cv.CV_8UC1)
    cv.cvSet (kpw [i], cv.RealScalar (0), cv.NULL)
    cv.cvSet (kpb [i], cv.RealScalar (0), cv.NULL)

Сначала у меня не просто было kpw [i], и это выдавало мне ошибку. После быстрого поиска в Google я обнаружил, что вам нужно сначала проиндексировать массив, и они сделали это через добавление. Я попробовал этот фрагмент кода, чтобы получить 8 базовых ядер размером 3x3, но получил эту ошибку:

Traceback (последний последний вызов):

Файл "/home/krtzer/Documents/python_scripts/thinning.py", строка 14, в kpw.append [i] = cv.CreateMat (3, 3, cv.CV_8UC1) TypeError: объект 'builtin_function_or_method' не поддерживает назначение элементов

Означает ли это, что у меня не может быть матриц в списках?


person krtzer    schedule 02.03.2012    source источник
comment
Является ли Kpw (заглавная K) преднамеренным (будет отличаться от kpw (нижний регистр k))?   -  person mathematical.coffee    schedule 02.03.2012
comment
Этому алгоритму C может быть проще следовать. AFAIK OpenCV ничего подобного не делает и здесь вам не очень поможет (за исключением, может быть, начальной загрузки изображения).   -  person John Lyon    schedule 02.03.2012
comment
@ mathematical.coffee Трудно сказать, так как я взял это из исходного кода. Не имеет смысла писать его с заглавной буквы, поскольку оно никогда не объявлялось и не использовалось где-либо еще в коде. И спасибо, ребята, что так быстро отреагировали на это.   -  person krtzer    schedule 02.03.2012


Ответы (3)


Это разыменование просто создает матрицу без инициализации ее данных. Данные вручную обнуляются такими строками, как cvSet (* (kpw + i), cvRealScalar (0), NULL).

В python вы можете просто сделать то же самое одним нажатием с помощью numpy.zeros, а затем использовать cv.fromarray. В качестве альтернативы используйте x = cv.CreateMat(3, 3, cv.CV_8UC1), а затем cv.set(x, 0.).

person wim    schedule 02.03.2012

Изменить - допустил (довольно большую) ошибку в этом ответе, объясню

Похоже на массив CvMat как в kpw, так и в kpb.

Предположим, я сделал список массивов kpw = [] в Python.

*(kpw + i) = ... это то же самое, что сказать kpw[i] = ....

Похоже, другой код инициализирует список ядер матрицами 3x3 из 0, поэтому вы можете сделать:

# make a list of 8  3x3 matrices of 0.
kpw = []
for i in xrange(8):
    kpw.append(np.zeros((3,3)))
    kpb.append(np.zeros((3,3)))

Примечание. Раньше у меня было:

kpw = [np.zeros((3,3))] * 8
kpb = [np.zeros((3,3))] * 8

что неправильно! Он создает 8 ссылок на одну и ту же матрицу внутри kpw, поэтому изменение kpw[0] также изменит все остальные kpw[i]!


Тогда cvSet2D(*(kpb+0), 0, 0, cvRealScalar(0)); можно перевести на:

kpb[0][0,0] = 0

Поскольку *(kpb+0) захватывает матрицу в kpg[0], 0,0 означает элемент 0,0 матрицы, а 0 — это значение.

Итак: каждый раз, когда вы видите *(kpb+i), просто заменяйте kpb[i], и вы должны найти перевод этого кода.

person mathematical.coffee    schedule 02.03.2012
comment
1. Цикл в примере кода создает 8 матриц, а не 7 и 2. Вы используете одну и ту же матрицу 7 раз, что почти наверняка будет ужасной ошибкой! - person wim; 02.03.2012
comment
Спасибо за уловку в 1. Что касается 2., код в OP просто инициализирует 8 (спасибо) матриц со всеми нулями. Список Python kpw будет содержать 8 отдельных матриц, и изменение (скажем) kpw[0] не также изменит kpw[1]. - person mathematical.coffee; 02.03.2012
comment
Возможно, вы захотите перепроверить это. Сравните id(kpw[0]) и id(kpw[1]). - person wim; 02.03.2012
comment
О, я неправильно прочитал вывод, когда пробовал это в интерпретаторе Python. Ты прав. Я оставлю ответ как пример того, что нельзя делать. - person mathematical.coffee; 02.03.2012

Я сделал новый в питоне. Прореживание (Python)

person eiichiromomma    schedule 06.03.2012