Opencv实战(银行卡识别)

目录

  • 模版匹配
    • 不同方法对比
    • 一个模板匹配多个
  • 直方图及直方图均衡化
    • 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.mfbz.cn/a/68398.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云技术-混沌工程

目录 混沌工程 故障注入 监控和观测 自动化和持续集成 混沌工程 混沌工程(Chaos Engineering)是一种实验性的系统可靠性工程方法,主动引入故障和异常来测试系统的弹性和容错能力。混沌工程的核心思想是通过模拟故障场景来验证系统在各种异…

105. 从前序与中序遍历序列构造二叉树

题目描述 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,n…

2023年加湿器市场数据分析(天猫数据分析怎么做)

随着人们生活水平提高、空调广泛使用,导致皮肤紧绷、口舌干燥、咳嗽感冒等空调病的滋生。可以看出,空气湿度与人体健康以及日常生活有着密切的联系。而加湿器作为室内空气湿度控制的重要工具,在近年来受到了越来越多的重视。根据鲸参谋电商数…

linux鲁班猫代码初尝试[编译镜像][修改根文件系统重编译]

编译镜像 官方百度云盘资料:https://doc.embedfire.com/linux/rk356x/quick_start/zh/latest/quick_start/baidu_cloud/baidu_cloud.html 解压虚拟机压缩包:"鲁班猫\8-SDK源码压缩包\开发环境虚拟机镜像\ubuntu20.04.7z"后既可以用VMware打开,打开后可以看到已经有…

nginx基于源码安装的方式对静态页面、虚拟主机(IP、端口、域名)和日志文件进行配置

一.静态页面 1.更改页面内容 2.更改配置文件 3.测试 二.虚拟主机配置 1.基于IP (1)在html目录下新建目录存放测试文件 (2)修改nginx.conf文件,在htttp模块中配置两个server模块分别对应两个IP (3&am…

深入解析中国供应商API:关键字搜索接口对接与商品数据交互指南

随着电商行业的快速发展,越来越多的企业开始与中国供应商进行合作。而为了实现有效的数据交换和协作,接口对接成为了不可或缺的一环。本文将深入探讨中国供应商API,介绍如何高效地进行接口对接与数据交互,并提供实用的Python示例代…

【论文阅读】基于深度学习的时序预测——Informer

系列文章链接 论文一:2020 Informer:长序列数据预测 论文二:2021 Autoformer:长序列数据预测 文章地址:https://arxiv.org/abs/2012.07436 github地址:https://github.com/zhouhaoyi/Informer2020 参考解读…

【面试八股文】每日一题:谈谈你对异常的理解

每日一题-Java核心-谈谈你对异常的理解【面试八股文】 异常是程序在运行过程中出现的错误或不正常的情况。当程序执行过程中遇到无法处理的错误或者不符合预期的情况,就会抛出异常。异常可以分为两种类型:受检异常和非受检异常。 受检异常是指在程序编译…

【数据结构】链表(一)

链表(一) 文章目录 链表(一)01 引入02 概念及结构03 单向不带头不循环链表实现3.1 创建节点类型3.2 简易创建一个链表3.3 遍历链表每个节点3.4 获取链表长度3.5 查找是否包含关键字key是否在单链表当中3.6 头插法3.7 尾插法3.8 任…

国产数据库排行

目录 一、理论 1.国产数据库排行 2.数据 一、理论 1.国产数据库排行 (1)墨天轮榜单 墨天轮国产数据库流行度排行于2019年6月推出,通过近50个维度的数据来考察近300个国产数据库的流行度排行,每月1日更新排行数据&#xff0c…

layui的基本使用-日期控件的业务场景使用入门实战案例一

效果镇楼&#xff1b; 1 前端UI层面&#xff1b; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&…

虚幻引擎游戏开发过程中,游戏鼠标如何双击判定?

UE虚幻引擎对于游戏开发者来说都不陌生&#xff0c;市面上有47%主机游戏使用虚幻引擎开发游戏。作为是一款游戏的核心动力&#xff0c;它的功能十分完善&#xff0c;囊括了场景制作、灯光渲染、动作镜头、粒子特效、材质蓝图等。本文介绍了虚幻引擎游戏开发过程中游戏鼠标双击判…

培训报名小程序报名功能开发

目录 1 创建页面2 新建URL参数3 课程详细信息4 报名数据源创建5 报名信息功能开发6 设置页面跳转7 最终实现的效果总结 在培训报名小程序中&#xff0c;我们已经开发了首页和列表页。在列表页点击报名时就跳转到报名页面&#xff0c;先看我们的原型 报名页分为两个部分&#x…

多货币多汇率跨境电子商城建设(仓储管理、网络安全)

多货币多汇率跨境电子商城建设需要考虑到多个方面&#xff0c;包括仓储管理、网络安全、货币兑换、物流配送等。以下是具体的介绍&#xff1a; 一、仓储管理 仓储管理是跨境电子商城的重要组成部分&#xff0c;需要考虑到商品的存储、管理和分拣等环节。以下是需要注意的几个…

C# 使用FFmpeg.Autogen对byte[]进行编解码

C# 使用FFmpeg.Autogen对byte[]进行编解码&#xff0c;参考&#xff1a;https://github.com/vanjoge/CSharpVideoDemo 入口调用类&#xff1a; using System; using System.IO; using System.Drawing; using System.Runtime.InteropServices; using FFmpeg.AutoGen;namespace F…

LinuxC编程——线程

目录 一、概念二、进程与线程的区别⭐⭐⭐三、线程资源四、函数接口4.1 线程创建4.2 线程退出4.3 线程回收4.3.1 阻塞回收4.3.2 非阻塞回收 4.4 pthread_create之传参4.5 练习 一、概念 是一个轻量级的进程&#xff0c;为了提高系统的性能引入线程。 进程与线程都参与cpu的统一…

内核裁剪与驱动编译

linux设备驱动以内核模块的形式出现&#xff0c;编写linux内核模块编程是学习linux设备驱动的先决条件。 在编译linux内核之前要先配置linux内核。每个板子都有其对应的默认配置文件&#xff0c;这些默认配置文件保存在arch/arm/configs 目录中。比如xilinx_zynq_defconfig作为…

暗黑版GPT流窜暗网 降低犯罪门槛

随着AIGC应用的普及&#xff0c;不法分子利用AI技术犯罪的手段越来越高明&#xff0c;欺骗、敲诈、勒索也开始与人工智能沾边。 近期&#xff0c;专为网络犯罪设计的“暗黑版GPT”持续浮出水面&#xff0c;它们不仅没有任何道德界限&#xff0c;更没有使用门槛&#xff0c;没有…

英特尔发布雷电3接口:竟和USB Type-C统一了 - 全文

在过去的一年里&#xff0c;外部连接通信线的世界里发生了很多时。在这段时间&#xff0c;USB先后发布了10Gbps “超高速”USB3.1以及新的USB Type-C连接器&#xff0c;这是一种新式的可正反插的接口&#xff0c;将成为未来十年乃至更长时间上的行业标准。同时随着USB备用模式功…

centos自动同步北京时间

1、安装ntpdate服务 yum -y install ntpdate 2、加入自动任务计划 查找ntpdate的路径&#xff1a; which ntpdate 复制这个路径。 编辑自动任务计划并加入ntpdate&#xff1a; crontab -e # 每小时第30分钟同步AD域控时间 30 * * * * /usr/sbin/ntpdate -u 192.168.2.8 > …
最新文章