【OpenCV】28 图像积分图算法

28 图像积分图算法

代码

import cv2 as cv
import numpy as np


def get_block_sum(ii, x1, y1, x2, y2, index):
    tl = ii[y1, x1][index]
    tr = ii[y2, x1][index]
    bl = ii[y1, x2][index]
    br = ii[y2, x2][index]
    s = (br - bl - tr + tl)
    return s


def blur_demo(image, ii):
    h, w, dims = image.shape
    result = np.zeros(image.shape, image.dtype)
    ksize = 15
    radius = ksize // 2
    for row in range(0, h + radius, 1):
        y2 = h if (row + 1)> h else (row + 1)
        y1 = 0 if (row - ksize) < 0 else (row - ksize)
        for col in range(0, w + radius, 1):
            x2 = w if (col + 1)>w else (col + 1)
            x1 = 0 if (col - ksize) < 0 else (col - ksize)
            cx = 0 if (col - radius) < 0 else (col - radius)
            cy = 0 if (row - radius) < 0 else (row - radius)
            num = (x2 - x1)*(y2 - y1)
            for i in range(0, 3, 1):
                s = get_block_sum(ii, x1, y1, x2, y2, i)
                result[cy, cx][i] = s // num

    cv.imshow("integral fast blur", result)


src = cv.imread("../images/test1.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)
sum_table = cv.integral(src, sdepth=cv.CV_32S)
blur_demo(src, sum_table)

cv.waitKey(0)
cv.destroyAllWindows()

实验结果

在这里插入图片描述

解释

积分图算法介绍

积分图算法是图像处理中的经典算法之一,由Crow在1984年首次提出,它是为了在多尺度透视投影中提高渲染速度。

积分图算法是一种快速计算图像区域和以及图像区域平方和的算法。直白的说,就是很快计算一幅图像任意区域,也就是卷积区域下的像素值的和跟平方和它的核心思想就是对每一个图像建立起自己的积分图查找表,在图像处理的阶段就可以根据预先建立积分图查找表直接查找从而实现对均值卷积的线性时间计算。做到了卷积执行的时间与半径窗口大小的无关联。

这种算法被应用到基于NCC的快速匹配、对象检测和SURF变换中、基于统计学的快速滤波器等方面。第一个应用积分图像技术的应用是在Viola-Jones的对象检测框架中出现。

图像积分图的建立与查找

积分图的建立

图像积分图是根据原图像像素值而计算建立出来的,假设原图的大小为W_H,则积分图的大小为(W+1)_(H+1)。在积分图(integral image)上任意坐标(x,y)处的ii(x,y)即表示原图中坐标为(x,y)的点的左上角所有像素点像素值的和(平方和表中的就是平方和)。

和表和平方和表建立公式如下:
和表:
在这里插入图片描述
平方和表:
在这里插入图片描述

示例:假设输入图像为2x2大小的,则积分图为3x3大小。如下图:
在这里插入图片描述

积分图的查找

在这里插入图片描述
如上图,如果想求输入图像中的蓝色区域内的像素值之和(3+2+5+4=14),只要根据每个点左上方所有像素值和表值进行两次减法和一次减法即可:46-22-20+10=14。也就是右下角+左上角-右上角和左下角。
这样对于任意大小的区域只要进行两次减法和一次加法就可以计算出区域内像素值之和。


所有内容均来源于贾志刚老师的知识星球——OpenCV研习社,本文为个人整理学习,已获得贾老师授权,有兴趣、有能力的可以加入贾老师的知识星球进行深入学习。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值