Python 为什么cvSet2D接受一个双元组,为什么第一个元素的元组都保存为0?
Python 为什么cvSet2D接受一个双元组,为什么第一个元素的元组都保存为0?,python,c,image-processing,opencv,Python,C,Image Processing,Opencv,cvSet2D(矩阵,i,j,元组) 嗨。我正在剖析中给出的Gabor滤波器代码。我对cvSet2D有一些问题,特别是在以下代码段中使用的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*
cvSet2D(矩阵,i,j,元组)
嗨。我正在剖析中给出的Gabor滤波器代码。我对cvSet2D有一些问题,特别是在以下代码段中使用的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));
}
}
据我所知,cvSet2D将矩阵的第(j,I)个像素设置为上一个参数中定义的元组的等效颜色值。但是为什么它需要一个双倍元组呢?看到像素颜色被定义为整数的元组,接受整数的元组不是更自然吗
最后,如果我正确阅读了文档,那么使用的cvScalar方法将返回4元组
。我推测cvSet2D取前三个值并将其用作RGB 3元组。但是,看到Gabor滤波器的输出或多或少是灰度的,那就不成立了,在我的方案中产生的颜色将倾向于红色。那么,cvSet2D如何处理这个元组呢
谢谢你愿意费心解释的人 我认为对于灰度图像(矩阵),CvSet2D使用cvScalar中的第一个值设置唯一通道(亮度)。CvSet2D的文档似乎已损坏,我将尝试在代码中进行验证 编辑:在链接到的代码示例中,
内核
的类型为CV_32FC1,这意味着它只有一个通道。kernelImg
也是如此:
kernel = cvCreateMat(kernel_size,kernel_size,CV_32FC1)
kernelimg = cvCreateImage(cvSize(kernel_size,kernel_size),IPL_DEPTH_32F,1)
因此,标量只需要在其中设置一个通道值是有意义的。在OpenCV中,图像可以有1个(灰度)、2个、3个(RGB)或4个(RGB加alpha)通道。无论有多少通道,one
Set2D
功能用于所有图像。该元组的每个元素都用于指定通道值
您总是通过元组传递四个值,但OpenCV将只使用其中的第一个N
,其中N
是图像中的通道数。它将忽略其余部分。零只是一个公认的占位符,意思是“这个值不重要”。当然,您可以传递任何想要的值,但是代码的可读性会受到影响
之所以使用double作为参数类型,可能是因为它是Python中可以使用的最高精度类型。OpenCV将把这个值转换为正确的底层类型(它从图像中获取)
由于您处理的是单通道32位浮点图像(
CV_32FC1
),只需继续使用Set2D(image,(value,0,0,0))
,一切都会好起来。多亏了你们两位。但还要感谢@misha提供的额外细节。
kernel = cvCreateMat(kernel_size,kernel_size,CV_32FC1)
kernelimg = cvCreateImage(cvSize(kernel_size,kernel_size),IPL_DEPTH_32F,1)