2011-09-25 50 views
1

cvSet2D(matrix, i, j, tuple)爲什麼cvSet2D接受一個雙元組元組,爲什麼這個元組全部爲0,除了第一個元素?

嗨。我正在解剖http://www.eml.ele.cst.nihon-u.ac.jp/~momma/wiki/wiki.cgi/OpenCV/Gabor%20Filter.html中給出的Gabor濾波器代碼。我有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)) 

正如我」 m知道cvSet2D將矩陣的第(j,i)個像素設置爲最後一個參數中定義的元組的等效顏色值。但是爲什麼它需要一個雙元組?將一個像素顏色定義爲一個整數元組,是不是更自然一些?

最後,如果我正確讀取了文檔,則使用的cvScalar方法將返回4元組<given_value_in_double, 0.000000, 0.000000, 0.000000)>。我推測cvSet2D取前三個值並將其用作RGB三元組。但是,看到Gabor濾波器的輸出或多或少處於灰度級,這不會成爲這種情況,我的方案中生成的顏色將傾向於紅色。那麼,cvSet2D對這個元組做了什麼?

謝謝任何​​會花費心思解釋的人!

回答

1

在OpenCV中,圖像可以有1(灰度),2,3(RGB)或4(RGB加alpha)通道。一個Set2D函數用於所有圖像,無論它們有多少個通道。該元組的每個元素都用於指定通道值。

您總是通過元組傳遞四個值,但OpenCV將僅使用這些中的第一個N,其中N是圖像中通道的數量。它會忽略其餘的。 Zero只是一個被接受的地方擁有者,意思是「這個價值無關緊要」。當然,你可以傳遞任何你想要的值,但是代碼的可讀性會受到影響。

使用double作爲參數類型的原因可能是因爲這是您可以使用的Python中最高的精度類型。 OpenCV會將此值轉換爲適當的底層類型(它從圖像中獲取)。

由於您正在處理單通道32位浮動圖像(CV_32FC1),只需繼續使用Set2D(image, (value, 0, 0, 0))並且一切都應該沒問題。

+0

感謝你們倆。但額外感謝@misha的額外細節。 – skytreader

1

我認爲,對於灰度圖像(矩陣),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) 

所以它是有道理的標量只需要中設置一個信道值。

相關問題