cv2.sqrBoxFilter 是 OpenCV 中用于计算像素邻域平方和的盒式滤波函数

cv2.sqrBoxFilter 是 OpenCV 中用于计算像素邻域平方和的盒式滤波函数

代码

bash 复制代码
# -*- coding:utf-8 -*-
import cv2 as cv
import numpy as np
import sys


if __name__ == '__main__':
    # 读取图像并判断是否读取成功
    img = cv.imread('./images/eq.png', cv.IMREAD_ANYDEPTH)
    if img is None:
        print('Failed to read eq.png.')
        sys.exit()

    # 验证方框滤波算法的数组矩阵
    points = np.array([[1, 2, 3, 4, 5],
                       [6, 7, 8, 9, 10],
                       [11, 12, 13, 14, 15],
                       [16, 17, 18, 19, 20],
                       [21, 22, 23, 24, 25]], dtype='float32')

    # 将图像转为float32类型的数据
    img_32 = img.astype('float32')
    print("img_orign=.{}".format(img))
    img_32 /= 255.0
    print("img_32=.{}".format(img_32))
    # 方框滤波cv.boxFilter()和cv.sqrBoxFilter()
    # 进行归一化
    img_box_norm = cv.boxFilter(img, -1, (3, 3), anchor=(-1, -1), normalize=True)
    # 不进行归一化
    img_box = cv.boxFilter(img, -1, (3, 3), anchor=(-1, -1), normalize=False)

    # 进行归一化
    points_sqr_norm = cv.sqrBoxFilter(points, -1, (3, 3), anchor=(-1, -1),
                                      normalize=True, borderType=cv.BORDER_CONSTANT)
    img_sqr_norm = cv.sqrBoxFilter(img, -1, (3, 3), anchor=(-1, -1),
                                    normalize=True, borderType=cv.BORDER_CONSTANT)
    # 不进行归一化
    points_sqr = cv.sqrBoxFilter(points, -1, (3, 3), anchor=(-1, -1),
                                 normalize=False, borderType=cv.BORDER_CONSTANT)
    print("points_sqr=.{}".format(points_sqr))
    # 展示图像处理结果
    cv.imshow('Result(cv.boxFilter() NORM)', img_box_norm)
    cv.imshow('Result(cv.boxFilter()', img_box)
    cv.imshow('Result(cv.sqrBoxFilter() NORM', img_sqr_norm / np.max(img_sqr_norm))
    cv.imshow('Result(cv.sqrBoxFilter()', points_sqr / np.max(points_sqr))
    cv.waitKey(0)
    cv.destroyAllWindows()

cv2.sqrBoxFilter 是 OpenCV 中用于计算像素邻域平方和的盒式滤波函数,核心作用是快速统计图像局部区域的像素值平方和,常作为方差滤波、边缘检测、图像梯度计算等高级操作的基础(例如推导局部方差、标准差)。

函数基本语法

cv2.sqrBoxFilter(src, ddepth, ksize, dst=None, anchor=None, normalize=None, borderType=None)

返回值

返回与输入图像尺寸、通道数一致的输出图像(ndarray 格式),像素值为对应邻域的平方和(或归一化后的平方均值)。

核心原理

标准差图像中,亮区表示局部像素值波动大(边缘 / 纹理),暗区表示像素值均匀(平滑区域)。

关键注意事项

数据类型与溢出问题

输入为 uint8(0-255)时,像素平方最大值为 255²=65025,若核尺寸为 5×5,平方和最大值为 25×65025=1,625,625,远超 uint8 范围(0-255);

必须将 ddepth 设为 cv2.CV_32F/cv2.CV_64F,否则会导致值截断、结果错误。

与 cv2.boxFilter 的区别

边缘填充方式

默认 cv2.BORDER_DEFAULT(镜像填充)适合大多数场景;若需边缘用固定值填充(如黑色),可指定 borderType=cv2.BORDER_CONSTANT:

sqr_sum = cv2.sqrBoxFilter(img_float, cv2.CV_32F, (3,3), borderType=cv2.BORDER_CONSTANT)

非正方形核

核尺寸支持矩形(如 (7,3)),适用于定向统计(如水平方向平方和):

bash 复制代码
# 3(宽)×7(高)核,侧重水平方向的平方和统计
sqr_sum_rect = cv2.sqrBoxFilter(img_float, cv2.CV_32F, (3, 7))
相关推荐
人工智能培训几秒前
什么是马尔可夫决策过程(MDP)?马尔可夫性的核心含义是什么?
人工智能·深度学习·机器学习·cnn·智能体·马尔可夫决策
数据饕餮2 分钟前
提示词工程实训营08- 写作助手:文章、报告、创意文案——从“写作困难户“到“高产作家的蜕变秘籍
人工智能·大模型·提示词工程
wenzhangli73 分钟前
告别手撸架构图!AI+Ooder实现漂亮架构+动态交互+全栈可视化实战指南
人工智能·架构·交互
线束线缆组件品替网5 分钟前
Amphenol LTW 防水线缆 IP67/IP68 结构解析
运维·网络·人工智能·汽车·硬件工程·材料工程
码农水水18 分钟前
大疆Java面试被问:TCC事务的悬挂、空回滚问题解决方案
java·开发语言·人工智能·面试·职场和发展·单元测试·php
财迅通Ai19 分钟前
暗盘收涨24.61% MiniMax将于明日正式港股上市
人工智能
AI猫站长20 分钟前
快讯|腾讯ULTRALOGIC用“负分奖励”训练推理,北航SIAMD用“结构信息”反制AI水军,AI治理技术能否跟上AI生成技术的步伐?
人工智能·搜索引擎
木头左21 分钟前
基于集成学习的多因子特征融合策略在指数期权方向性预测中的应用
人工智能·机器学习·集成学习
CoderJia程序员甲31 分钟前
GitHub 热榜项目 - 日榜(2026-1-7)
人工智能·ai·大模型·github·ai教程
s090713631 分钟前
【综述】前视二维多波束成像声呐(FLS)图像处理算法全解析:从成像到深度学习
图像处理·人工智能·算法·声呐·前视多波束