OpenCV

简介: 关于使用OpenCV库进行图像处理的教程,包括了图像的读取、显示、获取、修改、保存、基本绘图操作以及图像的缩放、平移和旋转等处理方法。

杂项

课程来源

黑马程序员人工智能教程_10小时学会图像处理OpenCV入门教程
https://www.bilibili.com/video/BV1Fo4y1d7JL?p=2
【2021B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料+课件笔记)
课程地址:https://www.bilibili.com/video/BV1PV411774y?p=3&spm\_id\_from=pageDriver

配置Python环境

下载Anaconda: https://www.anaconda.com/products/individual
用conda安装库:conda install name
查看安装包路径:https://blog.csdn.net/jgw2008/article/details/97112009

pip list
pip show package_name
部分链接

Python疑难库下载:https://www.lfd.uci.edu/~gohlke/pythonlibs/
图像插值算法原理参考:https://blog.51cto.com/u\_14411234/3089890
图像旋转原理参考1:https://blog.csdn.net/lkj345/article/details/50555870
图像旋转原理参考2:http://m.elecfans.com/article/593609.html

OpenCV的模块

在这里插入图片描述

一、图像背景知识

1.图像

图:物体反射或透射光的分布
像:视觉系统接受的在系统内生成的认识
模拟图像:连续的图像,由物理量(如光强,电)的强弱变化来记录图像信息,容易受干扰
数字图像:离散的图像,分级存储 0/1来记录
位数:常为八位图 8bit 0~255灰度信息 人眼通常能感受16位-32位

2.图像的分类

1.二值图像
0/1 用于文字 线条图扫描识别(OCR)
2.灰度图
常为8位 0~255 由黑到白
3.彩色图
RGB 红 绿 蓝 三色彩通道 0~255

二、图像的基本操作

1.读取

img=cv2.imread(‘名字’,图像类型)
彩色图:cv2.IMREAD_COLOR
灰度图:cv2.IMREAD_GRAYSCALE
带透明度的Alpha通道图: cv2.IMREAD_UNCHANGED
可用1/0/-1指代

import cv2 as cv# opencv读取格式是BGR
import numpy as np
img=cv.imread('cat.jpg',1)
img#展示矩阵
#彩色图:cv.IMREAD_COLOR
#灰度图:cv.IMREAD_GRAYSCALE
#带透明度的Alpha通道图: cv.IMREAD_UNCHANGED
#可用1/0/-1指代彩/灰/含Alpha
2.显示

OpenCV的显示方法
cv2.imshow(‘窗口名’,变量名)
cv2.waitKey(0)
cv2.destroyAllWindows()
waitKey中0为按下任意键继续 其他数为等待ms

#cv2.imshow('窗口名',变量名) 
cv2.imshow('this_image',img)
#接waitKey保证显示时间
cv2.waitKey(5000)#0为按下任意键继续 其他数为等待ms
cv2.destroyAllWindows()#关闭窗口

matplotlib的显示方法
plt默认以RGB绘制,而OpenCV以BGR格式存储,故绘制时要翻转切换到BGR模式

import matplotlib.pyplot as plt
plt.imshow(img[:,:,::-1])#彩图以BGR形式绘制
#plt.imshow(img,cmap=plt.cm.gray) #灰度图
plt.show()
3.获取

获取像素点数据(BGR值和数据类型)

img[100,100]

获取整体尺寸行列数及通道数
(x,y,通道数)

img.shape
#尺寸及通道数

行数和列数
分别代表y和x
因此在输出(x,y)时应是(cols,rows)

rows,cols=car.shape[:2]#:2代表前面的y,x

获取图像大小
图像大小=像素点个数x通道数

img.size
#图像大小=像素点个数x通道数 196608=256x256x3

获取图像数据类型
当类型为uint8时显示 dtype(‘uint8’),即无符号整数8位

img.dtype
#数据类型
4.修改

修改像素点BGR数据

img[100,100]=(0,0,255)
#修改像素点BGR数据
#将颜色改为BGR中的纯红色

分解图像通道
分解为3个通道b,g,r

b,g,r=cv.split(img)
#通道分解

blue通道的灰度显示(其余通道类比)

plt.imshow(b,cmap=plt.cm.gray)
#blue通道的灰度显示

合并图像通道

img=cv.merge((b,g,r))
#通道合并

色彩空间转换
cv.cvtColor(img,flag)
flag为转换的类型AtoB

gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#cv.cvtColor(img,flag)
#flag为要转换的类型
#BGR转灰度 cv.COLOR_BGR2GRAY
#BGR转HSV cv.COLOR_BGR2HSV
#某些算法使用HSV格式的色彩空间
5.保存

cv2.imwrite(‘名字’,变量名)
写出图像

cv2.imwrite('cat_after.jpg',img)
6.在图像中绘制

生成基本图片数组

img=np.zeros((512,512,3),np.uint8)
#512x512x三通道,数据类型为无符号八位整数

绘制线
cv.line(图像,起始点坐标,终点坐标,BGR颜色,线宽)

cv.line(img,(0,0),(511,511),(255,0,0),5)
#cv.line(图像,起始点坐标,终点坐标,BGR颜色,线宽)

绘制圆
cv.circle(图像,圆心,半径,BGR颜色,线宽)
线宽-1时为实心圆

cv.circle(img,(256,256),60,(0,0,255),-1)
#cv.circle(图像,圆心,半径,BGR颜色,线宽)
#线宽-1时为实心圆

绘制矩形
cv.rectangle(图像,起始点坐标,终点坐标,BGR颜色,线宽)

cv.rectangle(img,(100,100),(400,400),(0,255,0),5)
#cv.rectangle(图像,起始点坐标,终点坐标,BGR颜色,线宽)

绘制文字
cv.putText(图像,字符串内容,字符框左下角点坐标,字体,字体大小,颜色,线宽,可忽略的LINE_AA)

cv.putText(img,"Herman",(0,450),cv.FONT_HERSHEY_COMPLEX,2,(255,255,255),10,cv.LINE_AA)
#cv.putText(图像,字符串内容,字符框左下角点坐标,字体,字体大小,颜色,线宽,可忽略的LINE_AA)
7.算术运算

图像的加法
OpenCV的加法是饱和算法,>=255即为255 一般来说效果更好

img1=cv.add(rain,car)

numpy的加法是取模运算 267%256=11 一般效果更差

img2=rain+car

在这里插入图片描述
图像的加权混合
img=cv.addWeighted(img1,weight1,img2,weight2,gama)
最后的伽马γ为加权运算后加的一个常数,可以为0

img3=cv.addWeighted(rain,0.3,car,0.7,0)
 #最后的伽马γ为加权运算后加的一个常数,可以为0

三、图像的处理

1.缩放与拉伸

cv.resize(img,可为None的绝对尺寸,可绝对/相对只写其一省略的相对尺寸fx=?,相对尺寸fy=?,可省略的interpolation=插值算法)
绝对尺寸法
相对于画布来说给予指定的像素值

res1 = cv.resize(car,(2000,9000),interpolation=cv.INTER_LINEAR)
#绝对尺寸 相对于画布来说给予指定的像素值
#cv.resize(img,可为None的绝对尺寸,可绝对/相对只写其一省略的相对尺寸fx=?,相对尺寸fy=?,可省略的interpolation=插值算法)
#cv.INTER_LINEAR等插值算法

相对尺寸法

res2=cv.resize(car,None,fx=0.5,fy=0.3)#相对尺寸 相对于原图的行或列的比例放大/缩小

图像插值算法原理参考:https://blog.51cto.com/u\_14411234/3089890

2.移动

M=np.float32([[1,0,100],[0,1,50]])
result=cv.warpAffine(img,M,dsize)
生成numpy的float32型矩阵,作为warpAffine的参数M,此处用中括号框起代表整体
1,0,100代表行方向平移100单位像素 0,1,50代表列方向上平移50单位像素

M=np.float32([[1,0,100],[0,1,50]])#生成numpy的float32型矩阵
#作为warpAffine的参数M,此处用中括号框起代表整体
#1,0,100代表行方向平移100单位像素 0,1,50代表列方向上平移50单位像素
#cv.warpAffine(img,M,dsize) dsize为整体画布的绝对大小
res3=cv.warpAffine(car,M,(2*cols,2*rows))#此处cols在前,rows在后,代表宽 高
3.旋转
#M=cv.getRotationMatrix2D(center,angle,scale) 生成旋转矩阵
#center为旋转锚点,angle为角度,scale为旋转后的相对比例
M2=cv.getRotationMatrix2D((0,rows),45,2)
rotat=cv.warpAffine(car,M2,(cols,rows))

图像旋转原理参考1:https://blog.csdn.net/lkj345/article/details/50555870
图像旋转原理参考2:http://m.elecfans.com/article/593609.html

目录
相关文章
|
并行计算 Linux PyTorch
在云上部署ChatGLM2-6B大模型(GPU版)
本教程指导您在配置了Alibaba Cloud Linux 3的GPU云服务器上,安装大模型运行环境(如Anaconda、Pytorch等),并部署大语言模型,最后通过Streamlit运行大模型对话网页Demo。教程包括创建资源、登录ECS实例、安装及校验CUDA、NVIDIA驱动和cuDNN等步骤。
|
存储 测试技术 C语言
C语言实现链表的各种功能
本文详细介绍了如何使用C语言实现链表的各种功能,包括链表节点结构的定义与操作函数的实现。链表作为一种常用的数据结构,具有节点自由插入删除、动态变化等特点。文中通过`link_list.h`和`link_list.c`两个文件,实现了链表的初始化、插入、删除、查找、修改等核心功能,并在`main.c`中进行了功能测试。这些代码不仅展示了链表的基本操作,还提供了丰富的注释帮助理解,适合作为学习链表的入门资料。
|
机器学习/深度学习 自然语言处理 Go
Python与Go在AIGC领域的应用:比较与分析
Python与Go在AIGC领域的应用:比较与分析
401 0
|
存储 算法
pid控制
这篇文章详细介绍了PID控制算法的理论基础、组成部分、不同形式的算法(位置式和增量式PID),以及参数调试的步骤和技巧,旨在帮助读者理解和应用PID控制器进行有效的系统控制。
1061 2
pid控制
|
SQL 测试技术 API
SqlAlchemy 2.0 中文文档(一)(1)
SqlAlchemy 2.0 中文文档(一)
554 1
SqlAlchemy 2.0 中文文档(一)(1)
|
应用服务中间件 Docker 容器
docker tomcat时间少8小时问题解决
通过这些步骤,你应该能够解决Docker容器中Tomcat时间少8小时的问题,并确保容器中的时间与主机系统的时间保持一致。请根据你的实际情况和时区要求来调整时区设置。
503 0
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
【6月更文挑战第23天】构建Java Web应用,Servlet与JSP携手打造在线图书管理系统,涵盖需求分析、设计、编码到测试。通过实例展示了Servlet如何处理用户登录(如`LoginServlet`),JSP负责页面展示(如`login.jsp`和`bookList.jsp`)。应用基于MySQL数据库,包含用户和图书表。登录失败显示错误信息,成功后展示图书列表。部署到Tomcat服务器测试功能。此基础教程为深入Java Web开发奠定了基础。
316 10
|
存储 Windows
移动硬盘数据恢复 详细操作指南 (6种方法)
很多情况下,移动硬盘丢失的数据是可以恢复的。本文将给大家详细介绍移动硬盘数据恢复的完整过程,帮助大家有效应对数据丢失问题。
|
传感器 网络协议 机器人
03 ROS Publisher-Topic-Subscriber实例
关于ROS(机器人操作系统)中发布者-订阅者模式的教程,详细讲解了如何创建功能包、编写发布者和订阅者的源码、定义和使用自定义消息类型,以及编译和运行发布者和订阅者节点的过程。
255 0
|
存储 机器人
01 ROS基本概念及命令
这篇文章介绍了ROS(机器人操作系统)的基本概念,如节点、ROS Master、参数、通信机制(话题和消息、服务)、功能包、命名空间和命名重映射,以及一些基本的ROS命令行工具的使用,例如rosnode、rostopic、rossrv、rosservice、rosparam和roslaunch。
528 0

热门文章

最新文章