Почему cvSet2D принимает кортеж двойных чисел, и почему этот кортеж все 0 сохраняет для первого элемента? - PullRequest
1 голос
/ 25 сентября 2011

cvSet2D(matrix, i, j, tuple)

Привет. Я анализирую код фильтра Габора, указанный в http://www.eml.ele.cst.nihon -u.ac.jp / ~ momma / wiki / wiki.cgi / OpenCV / Gabor% 20Filter.html . У меня есть несколько вопросов по cvSet2D, особенно когда они используются в следующих фрагментах кода (как указано в ссылке):

C код:

for (x = -kernel_size/2;x<=kernel_size/2; x++) {
  for (y = -kernel_size/2;y<=kernel_size/2; y++) {
    kernel_val = exp( -((x*x)+(y*y))/(2*var))*cos( w*x*cos(phase)+w*y*sin(phase)+psi);
    cvSet2D(kernel,y+kernel_size/2,x+kernel_size/2,cvScalar(kernel_val));
    cvSet2D(kernelimg,y+kernel_size/2,x+kernel_size/2,cvScalar(kernel_val/2+0.5));
  }
}

Код Python:

for x in range(-kernel_size/2+1,kernel_size/2+1):
      for y in range(-kernel_size/2+1,kernel_size/2+1):
          kernel_val = math.exp( -((x*x)+(y*y))/(2*var))*math.cos( w*x*math.cos(phase)+w*y*math.sin(phase)+psi)
          cvSet2D(kernel,y+kernel_size/2,x+kernel_size/2,cvScalar(kernel_val))
          cvSet2D(kernelimg,y+kernel_size/2,x+kernel_size/2,cvScalar(kernel_val/2+0.5))

Как мне известно, cvSet2D устанавливает (j, i) -й пиксель матрицы в эквивалентное значение цвета кортежа, определенного в последнем параметре. Но почему это принимает в кортеже двойных? Разве не естественнее принимать кортеж целых чисел, видя, что цвет пикселя определяется как кортеж целых чисел?

Наконец, если я правильно прочитал документы, используемый метод cvScalar возвращает 4-кортеж <given_value_in_double, 0.000000, 0.000000, 0.000000)>. Я предположил, что cvSet2D принимает первые три значения и использует его как RGB 3-кортеж. Но, учитывая, что выходные данные Фильтров Габора более или менее в оттенках серого, что не будет так, цвета, полученные в моей схеме, будут склоняться к красному. Итак, что cvSet2D делает с этим кортежем?

Спасибо за всех, кто возьмется объяснять!

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

В OpenCV изображения могут иметь 1 (полутоновый), 2, 3 (RGB) или 4 (RGB плюс альфа) каналы.Одна функция Set2D используется для всех изображений независимо от того, сколько у них каналов.Каждый из элементов этого кортежа используется для указания значения канала.

Вы всегда передаете четыре значения через кортеж, но OpenCV будет использовать только первые N из них, где N - это значениеколичество каналов в изображении.Это будет игнорировать все остальное.Ноль является просто принятым заполнителем, что означает «это значение не имеет значения».Конечно, вы можете передать любое значение, какое захотите, но читаемость вашего кода пострадает.

Причина, по которой double используется в качестве типа аргумента, возможно, потому, что это тип Python с самой высокой точностью, которыйты можешь использовать.OpenCV преобразует это значение в соответствующий базовый тип (который он получает из изображения).

Поскольку вы работаете с одноканальными 32-битными плавающими изображениями (CV_32FC1), просто продолжайте использовать Set2D(image, (value, 0, 0, 0)) и все должно быть в порядке.

1 голос
/ 25 сентября 2011

Я думаю, что для полутоновых изображений (матриц) CvSet2D устанавливает единственный канал (яркость), используя первое значение в cvScalar. Документация для CvSet2D, кажется, повреждена, я попытаюсь проверить в коде.

EDIT : В примере кода, с которым вы связаны, kernel имеет типCV_32FC1, что означает, что он имеет только один канал.Так же, как и kernelImg:

kernel = cvCreateMat(kernel_size,kernel_size,CV_32FC1)
kernelimg = cvCreateImage(cvSize(kernel_size,kernel_size),IPL_DEPTH_32F,1)

Поэтому имеет смысл, что скаляру требуется только одно значение канала, установленное внутри.

...