当前位置: 首页 > biancheng >正文

opencv从入门到精通 哦吼 07

进阶篇
本篇的内容较多,包含了 6 章内容,分别是模板匹配、滤波器、腐蚀与膨胀、图形检测、视频处理以及人脸检测和人脸识别。这 6 章内容虽然相对独立,但是在实际开发的过程中,是相辅相成、相得益彰的

目录

模板匹配

模板匹配方法

单模板匹配

单目标匹配

多目标匹配

滤波器

均值滤波器

中值滤波器

高斯滤波器

双边滤波器


模板匹配

模板匹配是一种最原始、最基本的识别方法,可以在原始图像中寻找特定图像的位置。模板匹配经常应用于简单的图像查找场景中,例如,在集体合照中找到某个人的位置。本章将介绍如何利用 OpenCV 实现模板匹配。

模板匹配方法

模板是被查找目标的图像,查找模板在原始图像中的哪个位置的过程就叫模板匹配。OpenCV 提供的 matchTemplate()方法就是模板匹配方法,其语法如下:

 result = cv2.matchTemplate(image, templ, method, mask)

 

        mask:可选参数。掩模,只有 cv2.TM_SQDIFF 和 cv2.TM_CCORR_NORMED 支持此参数,建议采用默认值。

返回值说明:

        result:计算得出的匹配结果。如果原始图像的宽、高分别为W、H,模板图像的宽、高分别为w、h,result 就是一个W-w+1 列、H-h+1 行的 32 位浮点型数组。数组中每一个浮点数都是原始图像中对应像素位置的匹配结果,其含义需要根据 method 参数来解读

在模板匹配的计算过程中,模板会在原始图像中移动。模板与重叠区域内的像素逐个对比,最后将对比的结果保存在模板左上角像素点索引位置对应的数组位置中。计算过程如图 10.1 所示。

模板移动到原始图像的边缘之后就不会继续移动了,所以模板的移动区域如图 10.3 所示,该区域的边长为「原始图像边长-模板边长 +1」,最后加 1 是因为移动区域内的上下、左右的 2 个边都被模板覆盖到了,如果不加 1 会丢失数据。

单模板匹配

匹配过程中只用到一个模板场景叫单模板匹配。原始图像中可能只有一个和模板相似的图像,也可能有多个。如果只获取匹配程度最高的那一个结果,这种操作叫作单目标匹配。如果需要同时获取所有匹配程度较高的结果,这种操作叫作多目标匹配。

单目标匹配

matchTemplate()方法的计算结果是一个二维数组,OpenCV 提供了一个 minMaxLoc()方法专门用来解析这个二维数组中的最大值、最小值以及这 2 个值对应的坐标,minMaxLoc()方法的语法如下:

minValue, maxValue, minLoc, maxLoc = cv2.minMaxLoc(src, mask)

平方差匹配的计算结果越小,匹配程度越高。minMaxLoc()方法返回的 minValue 值就是模板匹配的最优结果,minLoc 就是最优结果区域左上角的点坐标,区域大小与模板大小一致。

import cv2
import numpy as np
img=cv2.imread('photos/img_1.png')
temple=cv2.imread('photos/img.png')
temple=cv2.resize(temple,(45,45))
cv2.imshow('t',temple)
result=cv2.matchTemplate(img,temple,cv2.TM_SQDIFF_NORMED)
minvalue,maxvalue,minloc,maxloc=cv2.minMaxLoc(result)
height,width,t=temple.shape
point1=minloc
point2=(point1[0]+width,point1[1]+height)
cv2.rectangle(img,point1,point2,(0,0,255),3)
cv2.imshow('img',img)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.waitKey(0)
cv2.destroyAllWindows()

多目标匹配

多目标匹配需要将原始图像中所有与模板相似的图像都找出来,使用相关匹配或相关系数匹配可以很好地实现这个功能。如果计算结果大于某值(例如 0.999),则认为匹配区域的图案和模板是相同的

滤波器

在尽量保留原图像信息的情况下,去除图像内噪声(图像噪声是图像数据中不必要的,或多余的干扰信息)、降低细节层次信息等一系列过程,叫作图像的平滑处理(或图像的模糊处理)。实现平滑处理最常用的工具就是滤波器。通过调节滤波器的参数,可以控制图像的平滑程度。OpenCV 提供了种类丰富的滤波器,每种滤波器使用的算法均不同,但都能对图像中的像素值进行微调,让图像呈现平滑效果。本章将介绍均值滤波器、中值滤波器、高斯滤波器和双边滤波器的使用方法。

均值滤波器

图像中可能会出现这样一种像素,该像素与周围像素的差别非常大,导致从视觉上就能看出该像素无法与周围像素组成可识别的图像信息,降低了整个图像的质量。这种「格格不入」的像素就是图像的噪声。如果图像中的噪声都是随机的纯黑像素或者纯白像素,这样的噪声称作「椒盐噪声」或「盐噪声」

 例如,图 11.4 就是均值滤波的计算过程。滤波核大小为 3×3,核心像素值是 35,颜色较深,周围像素值都为 110~150,因此可以认为核心像素是噪声。将滤波核中的所有像素值相加,然后除以像素个数,就得出了平均值 123(四舍五入取整)。将核心像素的值改成 123,其颜色就与周围颜色差别不大,图像就变得平滑了。这就是均值滤波去噪的原理。

OpenCV 将均值滤波器封装成 blur()方法,其语法如下:

  dst = cv2.blur(src, ksize, anchor, borderType)

import  cv2
import numpy as np
img=cv2.imread('dog/gou .jpg')
dst=cv2.blur(img,(3,3))
dst2=cv2.blur(img,(9,9))
cv2.imshow('dst2',dst2)
cv2.imshow('img',img)
cv2.imshow('sdt',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

中值滤波器

中值滤波器的原理与均值滤波器非常相似,唯一的不同就是不计算像素的平均值,而是将所有像素值排序,把最中间的像素值取出,赋值给核心像素。

OpenCV 将中值滤波器封装成 medianBlur()方法,其语法如下:

  dst = cv2.medianBlur(src, ksize)

注意

中值滤波器的 ksize 参数是边长,而其他滤波器的 ksize 参数通常为(高,宽)。

import cv2
import numpy as np
image=cv2.imread('dog/img.png',0)
image1=cv2.medianBlur(image,3)
image2=cv2.medianBlur(image,5)
image3=cv2.medianBlur(image,9)
cv2.imshow('image',image)
cv2.imshow('3',image1)
cv2.imshow('5',image2)
cv2.imshow('9',image3)
cv2.waitKey(0)
cv2.destroyAllWindows()

高斯滤波器

高斯滤波也被称为高斯模糊或高斯平滑,是目前应用最广泛的平滑处理算法。高斯滤波可以很好地在降低图片噪声、细节层次的同时保留更多的图像信息,经过处理的图像呈现「磨砂玻璃」的滤镜效果。

进行均值滤波处理时,核心周围每个像素的权重都是均等的,也就是每个像素都同样重要,所以计算平均值即可。但在高斯滤波中,越靠近核心的像素权重越大,越远离核心的像素权重越小

 OpenCV 将高斯滤波器封装成了 GaussianBlur()方法,其语法如下:

  dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY, borderType)

import  cv2
import numpy as  np
image=cv2.imread('dog/gou .jpg')
dst1=cv2.GaussianBlur(image,(15,15),0,0)
cv2.imshow('image',image)
cv2.imshow('dst',dst1)
cv2.waitKey(0)
cv2.destroyAllWindows()

双边滤波器

不管是均值滤波、中值滤波还是高斯滤波,都会使整幅图像变得平滑,图像中的边界会变得模糊不清。双边滤波是一种在平滑处理过程中可以有效保护边界信息的滤波操作方法。

OpenCV 将双边滤波器封装成 bilateralFilter()方法,其语法如下:

dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType)

import cv2
import numpy as  np
image=cv2.imread('match/img.png')
image1=cv2.GaussianBlur(image,(3,3),0,0)
image2=cv2.bilateralFilter(image1,15,120,100)
cv2.imshow('img2',image2)
cv2.imshow('img',image)
cv2.imshow('imag1',image1)
cv2.waitKey(0)
cv2.destroyAllWindows()

小结
噪声指的是一幅图像内部的、高亮度的像素点。图像平滑处理是指在尽量保留原图像信息的情况下,去除图像内部的这些高亮度的像素点(也就是「噪声」)。为了实现图像平滑处理,需要的工具就是滤波器。本章主要讲解了 OpenCV 中的 4 种滤波器,虽然每种滤波器的实现原理都不同,但是每种滤波器都能对图像进行图像平滑处理。读者朋友在掌握这 4 种滤波器的实现方法的同时,也要熟悉这 4 种滤波器的实现原理。

相关文章:

  • 牛客练习赛#84 F 莫比乌斯反演+杜教筛+技巧+斐波那契数列和gcd的结论+矩阵快速幂
  • ZZNUOJ_用C语言编写程序实现1342:支配值数目(附完整源码)
  • java毕业设计后勤管理系统餐饮评价监督系统(附源码、数据库)
  • 前端基础学习笔记
  • 【TS】联合类型--类型断言--类型推断
  • 谈笑风声的秘密
  • QT影城网上售票系统
  • NetCDF数据在ArcMap中的使用
  • 打怪升级(考验思路)
  • 持续精进,改变自己