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的模块

OpenCV_第1张图片

一、图像背景知识

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 

OpenCV_第2张图片
图像的加权混合
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

你可能感兴趣的:(OpenCV,opencv,计算机视觉,图像处理)