python计算机视觉opencv图像金字塔轮廓及模板匹配

目录
  • 1.图像金字塔
    • ①高斯金字塔
    • ②拉普拉斯金字塔
  • 2.图像轮廓
    • ①寻找轮廓
    • ②轮廓特征
    • ③轮廓绘制
  • 3.模板匹配
    • ①模板匹配
    • ②匹配框线绘制
    • ③多对象匹配
  • 4.直方图统计
    • ①直方图绘制
    • ②直方图统计
    • ③直方图的mask操作
    • ④直方图均衡化
  • 5.傅里叶变换

1.图像金字塔

①高斯金字塔

向下采样,数据会越来越少,减少的方式是:将偶数行和列删除

向上采样,数据会越来越多,将图像在每个方向上扩大为原来的两倍,新增的行和列用0来填充。使用先前同样的内核与放大后的图像卷积,获得近似值。

上采样之后,图片会变大。

下采样后,图片会变小。

②拉普拉斯金字塔

对于原始图像,先执行下采样,再执行上采样,并用原始图像减去得到的采样结果。

以上的计算方式为1层,第二层的计算,把第一层得到的结果作为原始图像进行计算。

2.图像轮廓

cv.findContours(img,mode,method)

最常用的mode:

RETR_TREE,检测所有的轮廓,并重构嵌套轮廓的整个层次

最常用的method:

CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)

CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是函数只保留他们的终点部分。

①寻找轮廓

函数返回的第一个参数contours就是我们所需要的轮廓信息。它是一个列表的形式。每一个元素都是数组形式。一个图像中可能有多个轮廓,并且会有外轮廓以及内轮廓,均可通过返回的contours调用。

②轮廓特征

通过调用不同的函数可以求得轮廓的面积以及周长等。

③轮廓绘制

第一个参数就是要画上去的图,第二个是轮廓信息,第三个是轮廓的索引,第四个是使用的颜色通道,第五个是线条的宽度。

也可以画出轮廓的边界矩形或者外接圆:

3.模板匹配

模板匹配 模板在原图像上,从原点开始滑动,计算模板与图像被模板覆盖的地方的差别程度,这个差别程度在opencv里有6种,然后将每次计算的结果放在一个矩阵里,作为结果输出。假如原图像是AB,模板是ab大小,则输出结果是(A-a+1) * (B-b+1)

TM_SQDIFF:平方差异,越小越相关

TM_CCORR:相关性,越大越相关

TM_CCOEFF:相关系数,越大越相关

TM_SQDIFF_NORMED:归一化平方不同,越接近0越相关

TM_CCORR_NORMED:归一化相关性,越接近1越相关

TM_CCOEFF_NORMED:归一化相关系数,越接近1越相关

建议:尽量使用归一化的方法

①模板匹配

读取图片以及需要匹配的模板,并将其进行灰度化处理:

下面得到的h,w就是模板的长和宽

通过matchTemplate的方法进行匹配:

②匹配框线绘制

对于匹配所得的返回值,通过minMaxLoc得到最小值和最大值,以及各自对应的坐标。根据选择的方法不同,所需要的目标值不同。比如TM_SQDIFF_NORMED:归一化平方不同,就是越接近0越相关,即越小越好。

得到了最佳的值以及坐标,就可以画出来矩形框。

在rectangle方法中,参数依次是:要画框的图片,框的左上角坐标,框的右下角坐标,框的亮度,框的线条粗细。结果如下:

③多对象匹配

模板匹配也可匹配多个对象,若图片中有多个和模板匹配的内容,cv.matchTemplate返回的内容中会有多个分数高的结果,设定阈值后,把分数高的结果的坐标,按同样的方式处理,把方框全部画出来即可。

4.直方图统计

①直方图绘制

可直接通过plt.hist方法,将图像矩阵扁平化之后,绘制不同的像素出现的频率直方图。

②直方图统计

cv2.calcHist(images,channels,mask,histSize,ranges)

参数中:

imges:传入的图像

channels:颜色通道,如果是灰度图就是[0],如果是彩色可以是[0],[1],[2]。分别对应着BGR。

mask:掩膜,如果需要对图像进行掩膜处理可以传入此参数。

histSize:就是bin的数目,可以直接填入[256]

ranges:像素值范围,常为:[0,256]

注意:传入参数时,都需要用中括号括起来。

calcHist返回值是对应颜色的统计值。当i是0的时候,就是B,1对应G,2对应R

③直方图的mask操作

创建mask,此处使用图片的长宽作为mask的长宽,并把需要展示的地方置为1,其他地方置为0即可。

通过bitwise_and,即“与”操作,即可实现掩膜操作。

把Mask应用到图片中,并画出直方图:

④直方图均衡化

通过cv.equalizeHist方法,可以对直方图进行均衡化

直方图前后对比如下:

对应的图像发生的变化如下:

以上的方式是对全局直接进行均衡化。可以看出图中雕像的脸变得模糊。通过自适应直方图均衡化可解决此问题,自适应均衡化是通过将图片分成不同的小块,对每一小块进行各自的均衡化。

5.傅里叶变换

低通滤波是保留低频,图像会变得模糊。高通滤波是保留高频,图像的细节会增强。

在opencv中主要是cv2.dft()和cv2.idft(),输入图像需要先转换成np.float32的格式 得到的结果中,频率为0的部分会在左上角,通常要转换到中心位置,可以通过shift变换来实现 cv2.dft()得到的结果是双通道的(实部、虚部),通常还需要转换成图像格式才能展示(0,255)

上图是将图片转换到频域之后,转换成灰度图并且展示的形式。

在低通滤波中,当转换到频域并把低频的放到中间后,只需要设置一个掩膜,即可把图像高频滤除掉。然后在通过逆转换,还原图像即可。具体代码如下:

在高通滤波器中,只需要把上面的代码中的掩膜转换一下,把0换成1,1换成0即可实现高通滤波。最终的图片展示如下:

可以看出,图片只保留了高频,也就是变化剧烈的部分,也就是图像中的边缘。

以上就是python计算机视觉opencv图像金字塔轮廓及模板匹配的详细内容,更多关于python opencv图像金字塔轮廓及模板匹配的资料请关注我们其它相关文章!

(0)

相关推荐

  • OpenCV半小时掌握基本操作之图像基础操作

    目录 概述 截取图像 获取颜色通道 读取视频 [OpenCV]⚠️高手勿入! 半小时学会基本操作⚠️ 图像基础操作 概述 OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 OpenCV 的世界. 截取图像 例子: # 截取图像 img = cv2.imread("picture.jpg") img = img[200:600, 400:1000] cv2.imshow("cut", img) cv2.waitKey(

  • Python-OpenCV基本操作方法详解

    基本属性 cv2.imread(文件名,属性) 读入图像 属性:指定图像用哪种方式读取文件 cv2.IMREAD_COLOR:读入彩色图像,默认参数,Opencv 读取彩色图像为BGR模式 !!!注意 cv2.IMREAD_GRAYSCALE:读入灰度图像. cv2.imshow(窗口名,图像文件) 显示图像 可以创建多个窗口 cv2.waitKey() 键盘绑定函数 函数等待特定的几毫秒,看是否由键盘输入. cv2.namedWindow(窗口名,属性) 创建一个窗口 属性:指定窗口大小模式

  • 详解OpenCV图像的概念和基本操作

    前言: opencv最主要的的功能是用于图像处理,所以图像的概念贯穿了整个opencv,与其相关的核心类就是Mat. 像素: 图片尺寸以像素为单位时,每一厘米等于28像素,如1515厘米长度的图片,等于420420像素的长度.一个像素所能表达的不同颜色数取决于比特每像素(BPP). 灰度图像:8bpp=2的8次方=256色, 高彩色:16bpp=2的16次方=65536色, 真彩色:24bpps=2的24次方=16777216色. 图像分辨率: 图像分辨率是图像总像素的多少,由于图像通常用矩阵表

  • Python opencv操作深入详解

    直接读取图片 def display_img(file="p.jpeg"): img = cv.imread(file) print (img.shape) cv.imshow('image',img) cv.waitKey(0) cv.destroyAllWindows() 读取灰度图片 def display_gray_img(file="p.jpeg"): img = cv.imread(file,cv.IMREAD_GRAYSCALE) print (img

  • opencv python简易文档之图片基本操作指南

    前言 最近在学习opencv,使用的是python接口.于是想着写些相关的笔记供以后参考,有不足之处希望大家指出. 使用python学习opencv需要下载opencv第三方库. 使用pip安装即可. 安装命令: pip install opencv-python pip install opencv-contrib-python(opencv的贡献库) 引入opencv import cv2 读取图片: img=cv2.imread('cat.jpg') # cat.jpg路径为相对路径 #

  • python计算机视觉opencv图像金字塔轮廓及模板匹配

    目录 1.图像金字塔 ①高斯金字塔 ②拉普拉斯金字塔 2.图像轮廓 ①寻找轮廓 ②轮廓特征 ③轮廓绘制 3.模板匹配 ①模板匹配 ②匹配框线绘制 ③多对象匹配 4.直方图统计 ①直方图绘制 ②直方图统计 ③直方图的mask操作 ④直方图均衡化 5.傅里叶变换 1.图像金字塔 ①高斯金字塔 向下采样,数据会越来越少,减少的方式是:将偶数行和列删除 向上采样,数据会越来越多,将图像在每个方向上扩大为原来的两倍,新增的行和列用0来填充.使用先前同样的内核与放大后的图像卷积,获得近似值. 上采样之后,图

  • python OpenCV图像金字塔

    目录 1.图像金字塔理论基础 2.向下取样函数及使用 3.向上取样函数及使用 4.采样可逆性研究 5.拉普拉斯金字塔 6.图像轮廓介绍 轮廓近似 1.图像金字塔理论基础 图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构.一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合.其通过梯次向下采样获得,直到达到某个终止条件才停止采样.我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低.那我们为什么要做图像金字塔呢?这

  • python计算机视觉opencv矩形轮廓顶点位置确定

    目录 一.问题的引入 二.问题的解决方法 方法一: 方法二 三.一些实现代码 一.问题的引入 opencv在图像处理方面有着非常强大的功能,当我们需要使用opencv进行一些图像的矫正工作时,我们通常需要找到原图的一些关键点,然后计算变换后的图像坐标,最后通过仿射变换或者透视变换获得自己想要的矫正图像,比如将一张拍歪了的纸进行矫正,我们的首要任务就是找到原图的一些关键点,通常的做法就是找纸张的4个顶点. 二.问题的解决方法 第一步我们肯定要找到纸张相应的矩形轮廓,这里可以二值化再找,也可以使用一

  • Python OpenCV 图像区域轮廓标记(框选各种小纸条)

    学在前面 上篇 OpenCV 博客原计划完成一个 识别银行卡号的项目,但是写的过程中发现,技术储备不足,我无法在下述图片中,提取出卡号区域,也就无法进行后续的识别了,再次意识到了自己技术还不达标,继续学习.完不成,就实现其它学习项目. 轮廓识别实战 先看一下最终实现的效果,针对一张图片(该图片前景色和背景色差异较大),进行轮廓标记. 图片基本处理 import cv2 as cv src = cv.imread("./demo.jpg") gray = cv.cvtColor(src,

  • python计算机视觉opencv卡号识别示例详解

    目录 一.模板预处理 1.将模板设置为二值图 2.检测模板的轮廓 3.对模板轮廓排序,并将数字和轮廓一一对应,以字典存储 4.备注 二.图片预处理 1.初始化卷积核 2.图片预处理第一部分 3.图像预处理第二部分 三.轮廓处理 1.大轮廓过滤 2.小轮廓分割 模板图片如下: 需识别的图片如下: 一.模板预处理 1.将模板设置为二值图 2.检测模板的轮廓 3.对模板轮廓排序,并将数字和轮廓一一对应,以字典存储 排序的函数如下: 排序并存储: 4.备注 ①每一个数字对应的是二值图截出来的那个数字图的

  • 基于python使用OpenCV进行物体轮廓排序

    目录 1 引言 2 栗子 2.1 读取图像 2.2 获取轮廓 2.3 轮廓排序 2.4 其他结果 3 总结 1 引言 在进行图像处理过程中,我们经常会遇到一些和物体轮廓相关的操作,比如求目标轮廓的周长面积等,我们直接使用Opencv的findContours函数可以很容易的得到每个目标的轮廓,但是可视化后, 这个次序是无序的,如下图左侧所示: 本节打算实现对物体轮廓进行排序,可以实现从上到下排序或者从左倒右排序,达到上图右侧的可视化结果. 2 栗子 2.1 读取图像 首先,我们来读取图像,并得到

  • Python图像处理之图像金字塔详解

    目录 一.图像金字塔原理 二.图像向上取样 三.图像向下取样 四.总结 一.图像金字塔原理 上一篇文章讲解的图像采样处理可以降低图像的大小,本文将补充图像金字塔知识,了解专门用于图像向上采样和向下采样的pyrUp()和pyrDown()函数. 图像金字塔是指由一组图像且不同分别率的子图集合,它是图像多尺度表达的一种,以多分辨率来解释图像的结构,主要用于图像的分割或压缩.一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合.如图10-1所示,它包括了四层图像,将

  • python计算机视觉OpenCV入门讲解

    目录 前言 一.什么是计算机视觉 二.图片处理基础操作 图片处理:读入图像 图片处理:显示图像 图片处理:图像保存 三.图像处理入门基础 图像成像原理介绍 图像分类 四.灰度图像 五.彩色图像(RGB) 六.像素处理操作 读取像素 修改像素 使用python中的numpy修改像素点 七.获取图像属性 形状 像素数目 图像类型 八.图像ROI 九.通道的拆分与合并 拆分 合并 前言 本专栏将非常细致的讲解相关与计算机视觉OpenCV的相关知识即操作,非常的简单易懂.本文主要讲解相关与计算机视觉的相

  • OpenCV 图像金字塔的实现示例

    目录 1.高斯金字塔 2.拉普拉斯金字塔 本文主要介绍了OpenCV 图像金字塔,具有一定的参考价值,感兴趣的可以了解一下 高斯金字塔reduce void cv::pyrDown() expand void cv::pyrUp() 1.高斯金字塔 图像金字塔是对一张输入图像先模糊再下采样为原来的高.宽的1/2,不断重复模糊与下采样的过程就得到了不同分辨率的输出图像,叠加在一起就形成了图像金字塔. 高斯金字塔便是先进行高斯模糊,再进行reduce和expand操作.高斯金字塔中的较高级别(低分辨

  • python中opencv图像叠加、图像融合、按位操作的具体实现

    目录 1图像叠加 2图像融合 3按位操作 1图像叠加 可以通过OpenCV函数cv.add()或简单地通过numpy操作添加两个图像,res = img1 + img2.两个图像应该具有相同的深度和类型,或者第二个图像可以是标量值. NOTE: OpenCV添加是饱和操作,也就是有上限值,而Numpy添加是模运算. 添加两个图像时, OpenCV功能将提供更好的结果.所以总是更好地坚持OpenCV功能. 代码: import cv2 import numpy as np x = np.uint8

随机推荐