opencv从入门到精通 哦吼 07

news/2024/7/5 8:19:46

进阶篇
本篇的内容较多,包含了 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 种滤波器的实现原理。


http://lihuaxi.xjx100.cn/news/58083.html

相关文章

The Planets: Earth-Vulnhub靶场

下载靶机:下载地址 下载后直接在vm打开,把靶机和kali网络配置成NAT模式。 开启靶机,查看MAC地址。 打开kali使用命令arp-scan -l查看靶机ip:192.168.195.132 nmap -A 192.168.195.132查看开放的端口,能看到打开了80…

淘宝怎么进行补单?流程是什么?

淘宝怎么进行补单?流程是什么? 对于淘宝商家来说,需要好好的打好店铺的基础,为了能够做得更好,很多的淘宝商家们都会去补单。当然淘宝店铺补单都是有一定的技巧的,那么淘宝商家们如何去进行补单呢?下面进行介绍。 淘宝怎么进…

Nginx反向代理和负载均衡实战

004_Nginx实现反向代理负载均衡_哔哩哔哩_bilibili 准备两台服务器,每台安装tomcat。 准备一台服务器,安装nginx,未配置时,访问nginx,打开了index.html页面 配置upstream name{}这里name随便起,为集群的名字。 在lo…

Lesson 15 Good news 佳音

1.原文 2. 参考译文 3. New words and expressions Secretary/secret n. 秘密 ★nervous adj. 精神紧张的 ① adj. 神经质的,神经紧张的 She is a nervous woman. Do you see that nervous smile on her face?② 紧张的,担心的,情绪不安的…

假如面试官要你手写一个promise

promise 在开发中,经常需要用到promise,promise具有很多特性,这一次将对promise特性进行总结,并从零写一个promise。 步骤一 Promise特点 1,创建时需要传递一个函数,否则会报错2,会给传入的函…

《测绘综合能力》——大地测量

欢迎访问《注册测绘师考试知识》系列。《测绘综合能力》 大地测量 部分重要(常考)知识点(精简版)如下: 目录 1 大地测量参考系统与框架2 大地测量常数3 建立参心坐标系4 建立地心坐标系5 高程基准6 正常高7 深度基准8 重力系统与框架9 时间系统与框架10 三差改正(地面→椭…

gamma校正

伽玛校正(Gamma Correction)校正的目的输入转至线性空间输出前进行校正衰减校正的目的 保证所有的输入都转换到线性空间,并在线性空间下做各种光照计算(线性空间进行操作),最后输出通过gamma校正后进行显示…

vue2初学1-37

vue是什么 是一套用于构建用户界面(将数据变成界面)的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面&…