Opencv实战(银行卡识别)

news2024/11/24 2:26:30

目录

  • 模版匹配
    • 不同方法对比
    • 一个模板匹配多个
  • 直方图及直方图均衡化
    • Mask操作
    • 直方图均衡化
    • 自适应直方图均衡化

模版匹配

在这里插入图片描述
公式
在这里插入图片描述

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 
def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()
    cv2.waitKey(1)
# 模板匹配
img1 = cv2.imread('./汪学长的随堂资料/6/模板匹配/lena.jpg', 0)
template = cv2.imread('./汪学长的随堂资料/6/模板匹配/face.jpg', 0)
# 导入图片
img = cv2.imread('./汪学长的随堂资料/6/模板匹配/lena.jpg') # 读取原始图片,返回的img是一个包含图像所有像素值的NumPy数组,其中每个像素值都是一个BGR (Blue-Green-Red) 值的列表
imgTemp = cv2.imread('./汪学长的随堂资料/6/模板匹配/face.jpg') # 读取模板图片

# 执行模板匹配。cv2.matchTemplate函数的三个参数分别为:原始图片、模板图片、匹配算法
result = cv2.matchTemplate(img,imgTemp,cv2.TM_SQDIFF_NORMED)
print('result的形状: ', result.shape)
# 统计出数组的中最大值、最小值以及对应的索引
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result) # minLoc: 这是矩形左上角的坐标,由cv2.minMaxLoc函数返回。
# 绘制矩形框
print('minLoc: ', minLoc)
cv2.rectangle(img,minLoc,(minLoc[ 0 ]+imgTemp.shape[ 1 ],minLoc[ 1 ]+imgTemp.shape[ 0 ]),(255,0,0),2)
cv_show(img, 'img')

注:shape[0]是高h,shape[1]是宽w,根据左上角的点和右下角的点来确定矩形
在这里插入图片描述
result的形状: (154, 179)
minLoc: (107, 89)

在这里插入图片描述
在这里插入图片描述

不同方法对比

# 模板匹配
img = cv2.imread('./汪学长的随堂资料/6/模板匹配/lena.jpg', 0)
template = cv2.imread('./汪学长的随堂资料/6/模板匹配/face.jpg', 0)
h, w = template.shape[:2] 
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
           'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
for meth in methods:
    img2 = img.copy()

    # 匹配方法的真值
    method = eval(meth) # 'cv2.TM_CCOEFF' -> 0
    print (method)
    res = cv2.matchTemplate(img, template, method)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

    # 如果是平方差匹配TM_SQDIFF或归一化平方差匹配TM_SQDIFF_NORMED,取最小值
    if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)

    # 画矩形
    cv2.rectangle(img2, top_left, bottom_right, 255, 2)

    plt.subplot(121), plt.imshow(res, cmap='gray')
    plt.xticks([]), plt.yticks([])  # 隐藏坐标轴
    plt.subplot(122), plt.imshow(img2, cmap='gray')
    plt.xticks([]), plt.yticks([])
    plt.suptitle(meth)
    plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注:res结果中,白色或者黑色就是最大最小值也就是匹配的框

一个模板匹配多个

img_rgb = cv2.imread('./汪学长的随堂资料/6/模板匹配/mario.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('./汪学长的随堂资料/6/模板匹配/mario_coin.jpg', 0)
h, w = template.shape[:2]

res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED) # 使用归一化相关系数匹配方法
threshold = 0.8
# 取匹配程度大于%80的坐标
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):  # *号表示可选参数
    bottom_right = (pt[0] + w, pt[1] + h)
    cv2.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 2)

cv_show(img_rgb, 'img_rgb')

在这里插入图片描述

直方图及直方图均衡化

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 
def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()
    cv2.waitKey(1)

在这里插入图片描述

img = cv2.imread('./汪学长的随堂资料/6/模板匹配/cat.jpg',0) # 读取名为 'cat.jpg' 的图片,0 表示以灰度图模式打开图片

# 计算图片的直方图,输出是一个256x1的数组(hist),表示图片中每种像素值的数量。
# hist的大小是(256, 1),表示256个bins,每个bin对应一种灰度级别的像素数量。
hist = cv2.calcHist([img],[0],None,[256],[0,256])
hist.shape

下面这两行代码使用matplotlib库将计算得到的直方图进行绘制,256表示直方图分成256份。

# 使用matplotlib库的hist函数直接计算并绘制直方图。img.ravel()将图像的二维数组展平成一维数组,256表示直方图分成256份。
plt.hist(img.ravel(),256); 
plt.show()

在这里插入图片描述
下面这部分代码读取了一张彩色图片,并对每个通道分别计算了直方图,然后用不同的颜色将这三个通道的直方图画出来。

img = cv2.imread('./汪学长的随堂资料/6/模板匹配/cat.jpg') # 再次读取图片,这次是彩色模式。
color = ('b','g','r') # 定义三种颜色,分别对应BGR三个通道。
for i,col in enumerate(color): # 对三个通道进行遍历,计算每个通道的直方图并绘制
    histr = cv2.calcHist([img],[i],None,[256],[0,256]) 
    plt.plot(histr,color = col) 
    plt.xlim([0,256])

在这里插入图片描述

Mask操作

在这里插入图片描述

# 创建mask
# 创建一个和原图同样大小的全零矩阵,作为掩模(mask),np.uint8是数据类型,表示8位无符号整数,范围0-255。
mask = np.zeros(img.shape[:2], np.uint8)
print(mask.shape)
mask[100:300, 100:400] = 255 # 将掩模的一部分设置为255,这部分将被用于计算直方图
cv_show(mask,'mask')
img = cv2.imread('./汪学长的随堂资料/6/模板匹配/cat.jpg', 0)
cv_show(img,'img')

在这里插入图片描述

# 这里进行了一个位运算,使用掩模与原图进行“与”操作,得到的结果就是原图中被掩模部分的内容,其他部分为0。
masked_img = cv2.bitwise_and(img, img, mask=mask)#与操作
cv_show(masked_img,'masked_img')
# 计算完整图像和掩模图像的直方图
hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])

在这里插入图片描述

# 使用subplot在一个图中显示多个子图,包括原图,掩模,掩模后的图像以及两个直方图
plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask, 'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0, 256])
plt.show()

在这里插入图片描述

直方图均衡化

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

# 使用OpenCV的imread函数以灰度模式读取一张名为'clahe.jpg'的图片
img = cv2.imread('./汪学长的随堂资料/6/模板匹配/clahe.jpg',0)
# 通过调用matplotlib的hist方法对原始图像进行直方图统计,256表示将像素值分成256段进行统计
plt.hist(img.ravel(),256); 
plt.show()

在这里插入图片描述

# 使用OpenCV的equalizeHist函数对原始图像进行全局直方图均衡化操作。
# 全局直方图均衡化是一种提高图像对比度的方法,它可以改善图像的亮度分布和增强图像的对比度
equ = cv2.equalizeHist(img) 
plt.hist(equ.ravel(),256) #  对进行了全局直方图均衡化的图像进行直方图统计。
plt.show()

在这里插入图片描述

res = np.hstack((img,equ)) # 使用numpy的hstack函数,将原始图像和进行了全局直方图均衡化的图像进行水平拼接
cv_show(res,'res')

在这里插入图片描述

自适应直方图均衡化

在这里插入图片描述

# 这行代码是使用OpenCV的createCLAHE函数创建一个CLAHE对象。
# CLAHE(Contrast Limited Adaptive Histogram Equalization)即限制对比度的自适应直方图均衡化,它是全局直方图均衡化的改进版本。
# 与全局直方图均衡化不同,CLAHE是在图像的小块区域上进行直方图均衡化。
# clipLimit参数表示对比度的最大值,tileGridSize参数表示每个小块的大小。
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) 
res_clahe = clahe.apply(img) # 使用CLAHE对象的apply方法对原始图像进行CLAHE操作
res = np.hstack((img,equ,res_clahe)) # 将原始图像、全局直方图均衡化的图像、以及CLAHE处理后的图像进行水平拼接
cv_show(res,'res')

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/856344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win10 + VS2022 安装opencv C++

最近需要用到C opencv,看了很多帖子都需要自己编译opencv源码。为避免源码编译,可以使用VS来配置opencv C。下面是主要过程: 目录 1. 从官网下载 opencv - Get Started - OpenCV 2. 点击这个exe文件进行安装 3. 配置环境变量 4. VS中的项…

【数据结构与算法】多路查找树

多路查找树 二叉树的问题分析 二叉树的操作效率较高,但也存在问题。 二叉树需要加载到内存的,如果二叉树节点少,没什么问题,但是如果二叉树的节点很多(比如 1 亿),就存在如下问题&#xff1a…

【信号生成器】从 Excel 数据文件创建 Simulink 信号生成器块研究(Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

深度学习:使用卷积神经网络CNN实现MNIST手写数字识别

引言 本项目基于pytorch构建了一个深度学习神经网络,网络包含卷积层、池化层、全连接层,通过此网络实现对MINST数据集手写数字的识别,通过本项目代码,从原理上理解手写数字识别的全过程,包括反向传播,梯度…

selenium爬虫,配置谷歌浏览器的driver

用selenium爬虫时,明明已经安装了selenium模块,程序却运行不了 本文主要涉及驱动有问题driver 网上有很多手动的方法(查看谷歌浏览的版本然后在其他博主分享的webdriver中下载与自己谷歌版本号最贴近的版本号,并把webdriver的地址…

AtuoDL----Tensorboard可视化使用

本教程教你怎么在autodl上使用tensorboard。 1、保存tensorboard日志文件 修改保存日志文件的路径,只有在这个tf-logs下的日志文件才能显示 2、查看tensorboard 进入AutoPanel,点击Tensorboard就能查看

跟禹神VUE——组件间的通信方式(props配置项、组件间自定义事件、全局事件总线、消息订阅与发布、VUEX)

一、通过props配置项传递数据&#xff08;适用于父组件给子组件传递数据&#xff09; 父组件向子组件传递数据&#xff1a; 父组件代码&#xff1a;在子组件的标签中传递数据 <template><div><h2>学校名称&#xff1a;{{schoolName}}</h2><!-- 方…

ROS入门核心教材重要节选

ROS核心教程 1、文件系统 使用下述命令查看包 rospack ros pack(age&#xff09; 如rospack find roscpp roscd ros cd 如roscd roscpp rosls ros ls 如rosls roscpp2、ROS节点 节点可以理解为人工定义一个机器人模块&#xff0c;然后抽象成可执行文件。 rosnode li…

改进DevSecOps框架的 5 大关键技术

Markets and Markets的一项研究显示&#xff0c;全球DevOps的市场规模从2017年的29亿美元增加到2023年的103.1亿美元&#xff0c;预测期的年复合增长率(CAGR)为24.7%。人们对DevOps越来越感兴趣&#xff0c;因为DevOps不仅能够压缩软件的交付周期&#xff0c;还能提高交付的速度…

7.8 封装详解

7.8 封装详解 就是把东西装进箱子里&#xff0c;只留一个口&#xff0c;比如我们看电视的时候我们只用遥控器换一个台就行了&#xff0c;不需要知道电视里面是怎么构造的&#xff0c;电视机使用的厂家为了使用方便就把电视机内部的组件全部封装在了壳子里&#xff0c;只给我们…

Web-WebApp Vue.js 目录结构

WebApp Vue.js 目录结构 目录解析 目录/文件 说明 build 最终发布的代码存放位置。config 配置目录&#xff0c;包括端口号等。我们初学可以使用默认的。node_modules npm 加载的项目依赖模块 src 这里是我们要开发的目录&#xff0c;基本上要做的事情都在这个目录里。里面包…

剪切、复制、粘贴事件

剪切、复制、粘贴事件 oncopy 事件在用户拷贝元素上的内容时触发。onbeforecut 事件在用户剪切文本&#xff0c;且文本还未删除时触发触发。oncut 事件在用户剪切元素的内容时触发。onbeforepaste 事件在用户向元素中粘贴文本之前触发。onpaste 事件在用户向元素中粘贴文本时触…

(2023Arxiv)Meta-Transformer: A Unified Framework for Multimodal Learning

论文链接&#xff1a;https://arxiv.org/abs/2307.10802 代码链接&#xff1a;https://github.com/invictus717/MetaTransformer 项目主页&#xff1a;https://kxgong.github.io/meta_transformer/ 【注】&#xff1a;根据实验结果来看&#xff0c;每次输入一种数据源进行处…

【位操作符的几种题型】

位操作符的几种题型 目录 题型一&#xff1a;寻找“单身狗”。 题型二&#xff1a;计算一个数在二进制中1的个数 题型三&#xff1a;不允许创建临时变量&#xff0c;交换两个整数的内容 题型一&#xff1a;寻找“单身狗”。 1.1题目解析 在一个整型数组中&#xff0c;只有…

Spring 使用注解储存对象

文章目录 前言存储 Bean 对象五大注解五大注解示例配置包扫描路径读取bean的示例 方法注解 Bean Bean 命名规则重命名 Bean 前言 通过在 spring-config 中添加bean的注册内容&#xff0c;我们已经可以实现基本的Spring读取和存储对象的操作了&#xff0c;但在操作中我们发现读…

MySQL DAL单表练习一(学生表)

目录 步骤&#xff1a; 1、创建学生表 2、插入数据 1&#xff09;查询表中所有学生的信息 2&#xff09;查询表中所有学生的姓名和英语成绩 3&#xff09; 过滤表中的重复数据 4&#xff09; 统计每个学生的总分 5&#xff09; 所有学生总分上加上10 6&#xff09; 使…

Java实现COM串口通信

前言 本文主要是实现监听电脑的 com3串口数据 Honeywell的一个扫描识别的器插入 Window笔记本的USB接口。 我的电脑是 Window11的&#xff0c;不需要安装驱动&#xff0c;它自己就有一个 COM3的串口 我把这玩意儿插在我的我电脑的USB接口过后&#xff0c;在电脑的 设备管理器就…

python条件分支和循环语句

python中没有{}的写法&#xff0c;一般时通过缩进的方式来确定分支和循环需要执行的代码块。 if 需要判断的条件表达式:条件成立时的动作 elif 需要判断的条件表达式:条件成立时的动作 else:动作for 变量 in 迭代对象:动作 示例&#xff1a; while 退出条件:动作

【MySql】RR有幻读问题吗?MVCC能否解决幻读?

文章目录 前言RR 隔离级别MVCCRR MVCC 有幻读问题吗&#xff1f;幻读问题演示如何彻底解决幻读&#xff1f;小结 前言 幻读是 MySQL 中一个非常普遍&#xff0c;且面试中经常被问到的问题&#xff0c;如果你还搞不懂什么是幻读&#xff1f;什么是 MVCC&#xff1f;以及 MySQL…

JRebel激活服务搭建彻底解决第三方服务失效问题

下载代理激活服务 下载地址 启动服务 激活插件 随机序列号生成地址&#xff1a;GUID online erstellen 激活地址为&#xff1a;http://127.0.0.1:8888/自己生成的GUID 完成激活 参考资料&#xff1a;2023idea中热部署插件JRebel的激活方式