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。