- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
计算覆盖在滤波器上的像素值的平方和。
对于源图像中的每一个像素 (x, y),函数计算那些与放置在像素 (x, y) 上的滤波器重叠的邻域像素值的平方和。
未归一化的平方盒滤波器可用于计算局部图像统计量,如像素邻域内的局部方差和标准差。
sqrBoxFilter() 函数通常用于图像处理中,用于计算图像中每个像素点的邻域内的平方和。这种操作对于计算局部方差或协方差等统计量非常有用。在 OpenCV 中,sqrBoxFilter() 函数可以用来高效地计算这种平方和。
函数原型
cpp
void cv::sqrBoxFilter
(
InputArray src,
OutputArray dst,
int ddepth,
Size ksize,
Point anchor = Point(-1, -1),
bool normalize = true,
int borderType = BORDER_DEFAULT
)
参数
- 参数src 输入图像。
- 参数sdst 输出图像,与输入图像具有相同的尺寸和通道数。
- 参数sddepth 输出图像的深度(-1 表示使用 src 的深度)。
- 参数sksize 内核大小。
- 参数anchor 内核的锚点位置,即内核的中心点。默认情况下,使用 Point(-1, -1) 表示锚点位于内核的中心。
- 参数normalize 一个布尔标志,如果设置为 true,则结果会除以内核的面积进行归一化;如果为 false,则不进行归一化。
- 参数borderType 边界处理方式,决定了如何处理图像边缘外的像素。BORDER_WRAP 不是一种支持的边界处理方式。
代码示例
cpp
#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
// 加载原始图像
cv::Mat src = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/erik.jpg", cv::IMREAD_GRAYSCALE);
if (src.empty())
{
std::cout << "Could not open or find the image" << std::endl;
return -1;
}
cv::Size sz2Sh( 400, 600 );
cv::resize( src, src, sz2Sh, 0, 0, cv::INTER_LINEAR_EXACT );
// 定义输出图像
cv::Mat dst;
// 设置内核大小
cv::Size ksize(1, 1); //1x1 内核
// 使用 sqrBoxFilter 计算每个像素邻域内的平方和
cv::sqrBoxFilter(src, dst, CV_64F, ksize, cv::Point(-1, -1), false, cv::BORDER_DEFAULT);
// 显示结果图像
cv::imshow("original image", src);
cv::imshow("Square Sum", dst);
cv::waitKey();
return 0;
}