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

OpenCV Python 图像处理入门

OpenCV入门

OpenCV:轻量、高效、开源。最广泛使用的计算机视觉工具。

下面涉及图片的读取,RGB彩色通道,区域裁剪,绘制图形和文字,均值滤波,特征提取,模板匹配,梯度算法,阈值算法,形态学操作,摄像头读取。

  1. 第一个test01程序: 学习如何运行OpenCV的基本示例。
  2. 图像的彩色通道BGR: 了解OpenCV中图像颜色通道的表示方式。
  3. 图像的裁剪: 学习如何对图像进行裁剪操作。
  4. 绘制直线、矩形、圆形: 实践在图像上绘制基本图形。
  5. 均值滤波处理图像噪点: 使用均值滤波器去除图像噪声。
  6. 图像特征点的提取: 学习如何提取图像中的特征点。
  7. 模板匹配扑克牌上的菱形: 实现模板匹配技术。
  8. 图像的梯度算法与边缘检测: 探索图像梯度和边缘检测算法。
  9. 图像的二值化: 学习如何将图像转换为二值图像。
  10. 图像形态学之腐蚀和膨胀: 实践图像形态学操作。
  11. 调用电脑摄像头: 学习如何使用OpenCV捕获实时视频流。

1.第一个test01程序

import cv2
#查看cv2的版本
#print(cv2.__version__)
print(cv2.getVersionString())image = cv2.imread('opencv_logo.jpg')
#打印图片的维度(numpy)
print(image.shape)#显示图片
cv2.imshow('image', image)
cv2.waitKey(0)

结果:

 

2.图像的彩色通道BGR

图像的彩色通道,计算机对于图像色彩的描述,普遍使用了RGB3原色原理,也就是任何颜色都是由RGB,红绿蓝三种颜色按一定比例混合而成的。

对于open CV来说,存储一张彩色图片等同于存储三张灰度图,它们被存储在open CV图像数据的第三个维度上,灰度范围是零到255,OpenCV对颜色的存储顺序是BGR,与常见的RGB顺序刚好相反。当显示器需要渲染这张图片时,计算机会依次取出图像数据中的三张灰度图,再把它们分别投影到显示器的蓝色,绿色和红色的led芯片上。

import cv2
image = cv2.imread('opencv_logo.jpg')#BRG
cv2.imshow('blue', image[:,:,0])
cv2.imshow('green', image[:,:,1])
cv2.imshow('red', image[:,:,2])
#灰度图
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray',gray)cv2.waitKey(0)

结果:

 3.图像的裁剪

import cv2image = cv2.imread('opencv_logo.jpg')
#裁剪图片
crop=image[10:170,40:200]
#打印裁剪的图片
cv2.imshow('crop',crop)
cv2.waitKey(0)

对于OpenCV索引的顺序是先横行后纵列,也就是说:索引10:170对应的是第10横行到第170,所以40:200对应的是第40,纵列到第200列。这个索引顺序与某些图像处理工具是不同的,比如加州理工大学基于MATLAB的图像处理工具包,就使用了相反的索引顺序。

结果:

 

4.绘制直线、矩形、圆形

OpenCV的图像数据实际上是numpy数组数据结构,所以可以直接使用number派创建一个黑色画布,具体代码如下:np.zeros维度300x300x3,灰度的数值类型是无符号八位整数nside integer eight,把创建的image变量显示出来,可以看到它是300×300的黑色画布。

import cv2
import numpy as np
image = np.zeros((300, 300, 3), np.uint8)#在画布上绘制直线
cv2.line(image, (100, 200), (250, 250), (250, 250, 0), 2)
#在画布上绘制矩形
cv2.rectangle(image, (30, 100), (60, 150), (0, 250, 0), 2)
#在画布上绘制圆形
cv2.circle(image, (150, 100), 20, (0, 0, 255), 3)
#在画布上绘制字符
cv2.putText(image,"hello",(100,50),0,1,(255,255,255),2)cv2.imshow("image",image)
cv2.waitKey(0)

结果:

5.均值滤波处理图像噪点

import cv2
image = cv2.imread('plane.jpg')#高斯滤波器
gauss = cv2.GaussianBlur(image,(5,5),0)
#均值滤波器
median = cv2.medianBlur(image,5)cv2.imshow('image',image)
cv2.imshow('gauss',gauss)
cv2.imshow('median',median)
cv2.waitKey(0)

结果:

 

6.图像特征点的提取

import cv2
image = cv2.imread('opencv_logo.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#获取图像中的特征点,最多返回500个点,点的质量优于0.1,特征点之间的距离大于十个像素
corners = cv2.goodFeaturesToTrack(gray,500, 0.1, 10)
#把每一个点标记出来,显示结果
for corner in corners:x, y = corner.ravel()cv2.circle(image, (int (x), int(y)), 3, (255, 0, 255), -1)cv2.imshow('image', image)
cv2.waitKey(0)

结果:

 

7.模板匹配扑克牌上的菱形

目标是匹配扑克牌上的菱形,这张图片上一共有九个菱形,把它们都找出来。

import cv2
import numpy as np
image = cv2.imread('poker.jpg')
#把彩色图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#选取图像的一个区域作为匹配模板,使用索引横行75~105,纵列235~265,这个区域刚好包含一个菱形
template = gray[75:105,235:265]
#把带检测图像和模板都各自标准化,再来计算匹配度,这样可以保证匹配结果不受光照强度的影响
match = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)
#找出匹配系数大于0.9的匹配点,再把模板图案的长和宽求出来
locations = np.where(match >= 0.9)
w,h = template.shape[0:2]
#循环遍历每一个匹配点,在原始图像上画出对应的矩形框,显示结果,9个菱形都被找到了。
for p in zip(*locations[::-1]):x1,y1 = p[0], p[1]x2,y2 = x1 + w, y1 + hcv2.rectangle(image, (x1,y1), (x2,y2), (0, 255, 0), 2)cv2.imshow('image', image)
cv2.waitKey(0)

结果:

8.图像的梯度算法与边缘检测

import cv2
#读取图像的灰度图
gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE)
#拉普拉斯算子给出了图像明暗变化的趋势
laplacian = cv2.Laplacian(gray, cv2.CV_64F)
#canny边缘检测
canny = cv2.Canny(gray, 100, 200)
cv2.imshow("gray", gray)
cv2.imshow("Laplacian", laplacian)
cv2.imshow("Canny", canny)
cv2.waitKey(0)

 结果:

9.图像的二值化(阈值:非黑即白)

import cv2
#灰度图
gray = cv2.imread('bookpage.jpg',cv2.IMREAD_GRAYSCALE)
#定义一个固定阈值
ret,binary = cv2.threshold(gray,10,255,cv2.THRESH_BINARY)
binary_adaptive = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,115,2)
ret1,binary_otsu = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)cv2.imshow('gray',gray)
cv2.imshow('binary',binary)
cv2.imshow('binary_adaptive',binary_adaptive)
cv2.imshow('binary_otsu',binary_otsu)
cv2.waitKey(0)

结果:

10.图像形态学之腐蚀和膨胀

import cv2
import numpy as np
#读取灰度图
gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE)
#使用反向阈值,因为原始图片中背景是白色的,而我们想要把背景变为黑色,图案变为白色
_, binary = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV)
kernel = np.ones((5, 5), np.uint8)
#腐蚀
erosion = cv2.erode(binary, kernel)
#膨胀
dilation = cv2.dilate(binary, kernel)
cv2.imshow("binary", binary)
cv2.imshow("erosion", erosion)
cv2.imshow("dilation", dilation)
cv2.waitKey(0)

结果:

 

11.调用电脑摄像头

import cv2
#电脑上只有一个摄像头,所以序号是零
capture = cv2.VideoCapture(0)
#对于摄像头的采集是连续不断的,也就是说要循环读取每一帧的画面,
# 由于不确定循环多少次,我们先让它做死循环
while True:ret, frame = capture.read()# 读取摄像头中的画面,把它展示出来cv2.imshow('frame', frame)key = cv2.waitKey(1)if key != -1:break
#释放指针
capture.release()

结果:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 11.怎么做好一个动态标签页
  • 设计模式21-组合模式
  • P37-数据存储
  • 数据可视化:解锁数据奥秘的钥匙与实战指南
  • 力扣每日一题 特殊数组 II 前缀和
  • 分析 avformat_open_input 数据读取过程
  • 软件需求设计分析报告(Word原件)
  • nginx核心配置示例
  • 基于LangChain手工测试用例转接口自动化测试生成工具!
  • 第七章数据安全10分
  • Excel求和方法之
  • Pytorch如何判断两个模型的权重是否相同(比较权重差异/参数字典)
  • 推荐适合七夕的SVG模版(第II期)
  • FreeBSD启动后进入单用户模式,但是发现zfs系统是只读的,应该怎样挂载成可读可写呢?
  • SpringCloudAlibaba基础七-2 seata的使用
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【EOS】Cleos基础
  • Docker下部署自己的LNMP工作环境
  • gcc介绍及安装
  • HashMap剖析之内部结构
  • mysql外键的使用
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Object.assign方法不能实现深复制
  • Webpack 4 学习01(基础配置)
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 从零开始在ubuntu上搭建node开发环境
  • 记一次和乔布斯合作最难忘的经历
  • 区块链共识机制优缺点对比都是什么
  • 与 ConTeXt MkIV 官方文档的接驳
  • 主流的CSS水平和垂直居中技术大全
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 移动端高清、多屏适配方案
  • ​低代码平台的核心价值与优势
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (2)Java 简介
  • (SpringBoot)第二章:Spring创建和使用
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (待修改)PyG安装步骤
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (接口封装)
  • (十)Flink Table API 和 SQL 基本概念
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • .“空心村”成因分析及解决对策122344
  • .net core 连接数据库,通过数据库生成Modell
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Core中的去虚
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)