专栏首页贾志刚-OpenCV学堂OpenCV图像处理之基于积分图实现NCC快速相似度匹配

OpenCV图像处理之基于积分图实现NCC快速相似度匹配

微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 觉得文章对你有用,请戳底部广告支持

NCC概述

基于Normalized cross correlation(NCC)用来比较两幅图像的相似程度已经是一个常见的图像处理手段。在工业生产环节检测、监控领域对对象检测与识别均有应用。NCC算法可以有效降低光照对图像比较结果的影响。而且NCC最终结果在-1到1之间,所以特别容易量化比较结果,只要给出一个阈值就可以判断结果的好与坏。

NCC数学知识

们也可以通过各自的积分图计算预先得到。这样就完成了整个预计算生成。依靠索引表查找计算结果,NCC就可以实现线性时间的复杂度计算,而且时间消耗近似常量跟窗口半径大小无关,完全可以满足实时对象检测工业环境工作条件。

算法步骤

为了减小计算量,我们首先要把输入的图像转换为灰度图像,在灰度图像的基础上完成整个NCC计算检测。

  1. 把彩色图像转换为灰度图像
  2. 预计算模板图像和目标图像的积分图
  3. 根据输入的窗口半径大小使用积分图完成NCC计算
  4. 根据阈值得到匹配或者不匹配区域。
  5. 输出结果

检测结果:

标准合格电路板作为参照模板:

被污染的电路版

检测结果:

由于是项目代码不好公开,所以给大家演示一下OpenCV中利用积分图实现图像模糊的简单代码:

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)
    cv.imwrite("D:/result.png", result)


src = cv.imread("D:/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()

本文分享自微信公众号 - OpenCV学堂(CVSCHOOL)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 流程内耗的雾霾几时休?

    一个企业,无论大小,都具备“麻雀虽小,五脏俱全”的职能部门,都有人数或多或少的运作团队。正如金庸在《笑傲江湖》中写道:“有人就有恩怨,有恩怨就有江湖”,在协同运...

    landv
  • macOS: 查看CPU信息

    Petrichor_
  • macOS: 安装卷宗失败

    如果插上希捷移动硬盘后,mac右上角还是显示“安装卷宗失败”,则进入系统偏好设置 -> 安全性与隐私:

    Petrichor_
  • macOS: 查看隐藏文件

    Petrichor_
  • macOS: 没有移动硬盘的 写权限

    Note: 这里以希捷(seagate)硬盘为例。其他牌子移动硬盘写权限的问题可以举一反三。

    Petrichor_
  • python: 读取.xlsx文件

    Petrichor_
  • macOS: 字体(font)文件 的 存放路径

    Petrichor_
  • Tmux 使用

    [1] 十分钟学会 tmux [2] Tmux使用手册 [3] 第 2 章 配置 tmux

    Petrichor_
  • AOC显示器提示OSD锁定怎么办?

    macpro虽好,但屏幕实在太小了,而且原生的键盘敲起来很费劲,还是用机械键盘噼里啪啦敲打显得爽快。于是,给macpro外接了键鼠以及27寸的AOC显示器。

    章鱼喵
  • 如何对网页 长截图

    Petrichor_

扫码关注云+社区

领取腾讯云代金券