Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 是否可以仅在图像中的一个点上运行filter2D(卷积)?_Opencv - Fatal编程技术网

Opencv 是否可以仅在图像中的一个点上运行filter2D(卷积)?

Opencv 是否可以仅在图像中的一个点上运行filter2D(卷积)?,opencv,Opencv,我目前正在运行一个内核和一个映像: cv::filter2D(source, dest, CV_64F, kernal, cv::Point(-1,-1), 0, cv::BORDER_CONSTANT); 但是,我对用内核对整个图像进行卷积不感兴趣,我只想在源图像上的给定像素处运行卷积 这可能吗?从文档中可以看出,答案很简单:

我目前正在运行一个内核和一个映像:

cv::filter2D(source, 
             dest, 
             CV_64F, 
             kernal, 
             cv::Point(-1,-1), 
             0, 
             cv::BORDER_CONSTANT);
但是,我对用内核对整个图像进行卷积不感兴趣,我只想在源图像上的给定像素处运行卷积


这可能吗?

从文档中可以看出,答案很简单:

注意:当源图像是较大图像的一部分(ROI)时,该函数将尝试使用ROI之外的像素来形成边界

因此,解决方案是:

cv::Point point(x, y); 
Mat onePixelSourceROI(source, cv::Rect( point, cv::Size(1, 1) ));

cv::filter2D(onePixelSourceROI, 
             dest, 
             CV_64F, 
             kernal, 
             cv::Point(-1,-1), 
             0, 
             cv::BORDER_CONSTANT);

刚才看到文档中的一个注释,该注释建议只需裁剪1px ROI即可->注释当源图像是较大图像的一部分(ROI)时,该函数将尝试使用ROI之外的像素来形成边框。要禁用此功能并始终进行外推,就好像src不是ROI一样,请使用borderType | BORDER | u-ISOLATED。这听起来很合理,不过您也可以手动执行类似于
filterVal=subM.mul(kernel.sum其中
subM
是ROI。@烧杯-很酷,谢谢-我不知道你能做到。使用该方法会对像素边界产生什么影响?如果
subM
完全包含在原始矩阵中(即,所有值都存在),则将使用它们。如果
subM
从图像边缘脱落,则必须手动填充所需的值。例如,如果您想在图像的像素
(0,0)
上使用3x3内核,则必须使用类似的方法,使用第1行和第1列中缺失的5个值填充ROI。