快速学完OpenCV+python计算机视觉图像处理
Posted 满目星辰wwq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速学完OpenCV+python计算机视觉图像处理相关的知识,希望对你有一定的参考价值。
以下是一天学完OpenCV+python计算机视觉图像处理的个人总结。
任何知识或者学科都不可能一天学会,一口吃不成大胖子,想要学会,只能一点一点积累。
不积跬步无以至千里,不敲千遍无可能懂理。
想要学会,不能光看,须知熟才能生巧,一定要多敲!一定要多敲!一定要多敲!
视频链接请点击这里
代码连接请点击这里 ,提取码: iukw
看完视频一定要手动敲,不然最后只是眼睛会了,脑子和手却不会。
以下是Windows、Linux、Mac深度学习环境搭建详细教程:
2 计算机视觉入门之OpenCV入门、TensorFlow入门
2-1 本章介绍
本章主要内容:
- OpenCV初识
- OpenCV文件结构
- Demo1 图片读取:图片封装格式、压缩编码
- Demo2 图片写入:图片质量
- Demo3 像素操作:矩阵颜色空间
- 课程小结
OpenCV是一个开源的计算机视觉库,应用领域很广泛,在地图、导航、手机、嵌入式等等应用很常见。
2-2 Mac下一站式开发环境anaconda搭建
Mac版本的详细搭建流程我自己试了,其实大同小异,大家可以根据下面我给的链接按照操作一步一步搭建,很简单的。
- 下载并安装anaconda
- 下载并安装tensorflow和OpenCV
- 下载并安装notebook
点击这里,附上Mac详细安装教程
2-3 Windows下一站式开发环境anaconda搭建
这个视频里面讲的是tf1.x版本的,虽然现在工业界很多都还是使用的1.x版本,但是2.x确实比1.x强大很多,也在慢慢转换成2.x,大家也可以学习2.x版本的TensorFlow。
- 下载并安装anaconda
- 下载并安装tensorflow和OpenCV
- 下载并安装notebook
点击这里,附上Windows详细安装教程
2-4 测试案例Hello World
#1 import 2 string 3 print
import tensorflow as tf
hello = tf.constant('hello tf!')
sess = tf.Session()
print(sess.run(hello))
#常量 sess print
这里必须使用tf1.x版本,如果你的是tf2.x版本建议降级之后再使用
import cv2
print('hello opencv')
2-5 案例1:图片的读取和展示
import cv2
img = cv2.imread('image0.jpg',1)
cv2.imshow('image',img)
cv2.waitKey (0)
2-6 Opencv模块组织结构
opencv的框架与各模块功能介绍这里介绍了各个模块中的功能。
其中,比较重要的模块有core、imgcodecs、imgproc、ml、photo这几个模块。
2-7 案例2:图片写入
图片文件分为文件头和文件数据,不同的文件格式(jpg、png等),文件头和文件数据都是不一样的,文件数据也是文件进行压缩编码后的文件数据,而大部分的文件头描述的就是数据部分的的解码信息和以及附加信息,解码器可以根据附加信息将文件数据还原成图像最原始的数据。
代码如下:
import cv2
# 1 文件的读取 2 封装格式解析 3 数据解码 4 数据加载
img = cv2.imread('image0.jpg',1)
cv2.imshow('image',img)
# jpg png 1 文件头 2 文件数据
cv2.waitKey (0)
# 1.14M 130k
import cv2
img = cv2.imread('image0.jpg',1)
cv2.imwrite('image1.jpg',img) # 1 name 2 data
2-8 案例3:不同图片质量保存
不同图片质量也就是不同压缩比的图片。
1. JPEG
JPEG是有损压缩,压缩比为0-100,为0时,压缩比越高,越模糊;为100时,压缩比越低,越清晰(见下图)
import cv2
img = cv2.imread('image_jpg.jpg', 1) # 1M 100k 10k 0-100 有损压缩
cv2.imwrite('imageTest0.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 0])
cv2.imwrite('imageTest100.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 100])
imageTest0 = cv2.imread('imageTest0.jpg', 1)
imageTest100 = cv2.imread('imageTest100.jpg', 1)
cv2.imshow('img', img)
cv2.imshow('imageTest0', imageTest0)
cv2.imshow('imageTest100', imageTest100)
cv2.waitKey(0)
2. PNG
PNG是无损压缩,压缩比为0-9;为0时,压缩比越低,越清晰;为9时,压缩比越高,越模糊
import cv2
image_png = cv2.imread('image_png.png', 1) # 1M 100k 10k 0-100 有损压缩
cv2.imwrite('imageTest0.png', image_png, [cv2.IMWRITE_PNG_COMPRESSION, 0])
cv2.imwrite('imageTest9.png', image_png, [cv2.IMWRITE_PNG_COMPRESSION, 9])
imageTest0 = cv2.imread('imageTest0.png', 1)
imageTest9 = cv2.imread('imageTest9.png', 1)
cv2.imshow('image_png', image_png)
cv2.imshow('imageTest0', imageTest0)
cv2.imshow('imageTest9', imageTest9)
cv2.waitKey(0)
直观上,PNG图片看不出来有啥大变化,但是看直接看图片大小,我们可以清晰的看到为0时图片大小和原图一样,为9时小了很多。
2-9 像素操作基础
我们看到的每一张图片或者视频里面的每一帧,其实都是由像素点组成的,那么什么是像素点呢?百度吧!,上面都有,这里就不说了。
下图中,表示一个像素点由RGB三种颜色组成,RGB每一个基色都有8位,也就是0~255,而计算机只能识别二进制,所以下面那串数字就是对应计算机中读取到的这个像素点的数值。
下图中,第6点是png图片有个α系数,表示透明系数。还有,我们的彩色图像的通道由B、G、R这个顺序组成的。
2-10 案例4:像素读取写入
不要偷懒,手动敲一边。
这里有个小技巧,当我们输入某一个函数,不知道这个函数括号里面的变量是什么意思的时候,我们输入一个左括号或者第一个变量之后输入一个逗号,都会提示你下一个变量写什么,如果真的不知道什么意思,可以按住ctrl+点击鼠标左键进入函数内部查看
也有可能是ctrl+alt+鼠标左键,就比如我的电脑按住ctrl+左键就只是显示一堆|这个竖线。根据个人情况而议。
接下来就是像素读取写入代码:
import cv2
img = cv2.imread('1.jpg', 1) # 读取图片,其中0表示读入彩色图片,-1表示灰度图片,1表示保留读取图片原有的颜色通道
# 上面一句也可以用以下方式表示
img_color = cv2.imread('1.jpg', cv2.IMREAD_COLOR) # 可以用0表示cv2.IMREAD_COLOR
img_gray = cv2.imread('1.jpg', cv2.IMREAD_GRAYSCALE) # 可以用-1表示cv2.IMREAD_GRAYSCALE
img_unchanged = cv2.imread('1.jpg', cv2.IMREAD_UNCHANGED) # 可以用1表示cv2.IMREAD_UNCHANGED
(b, g, r) = img[50, 50] # img[50, 50]表示img在50,50这个位置的像素点,因为是三通道,分别对应着B、G、R,千万不能弄错
print(b, g, r) # 输出结果为251 252 250
# 50,150-->150,150,即画一条竖线
for i in range(1, 150):
img[50 + i, 150] = (0, 0, 255) # (0, 0, 255)表示红色
# 150,50-->150,150,即画一条横线
for i in range(1, 150):
img_color[150, 50 + i] = (0, 255, 0) # (0, 255, 0)表示绿色
# 50,50-->150,150,即将左上到右下组成的的矩形进行内部填充
for i in range(1, 150):
for j in range(1, 150):
img_gray[50 + i, 50 + j] = 255 # 255白色
# 50,150-->150,50,即将左下到右上组成的的矩形进行内部填充
for i in range(1, 150):
for j in range(1, 150):
img_unchanged[50 + i, 150 - j] = (255, 0, 0) # (255, 0, 0)表示蓝色
cv2.imshow("img", img)
cv2.imshow("img_color", img_color)
cv2.imshow("img_gray", img_gray)
cv2.imshow("img_unchanged", img_unchanged)
cv2.waitKey(0)
2-11 tensorflow常量变量定义
import tensorflow as tf
data1 = tf.constant(2, dtype=tf.int32)
data2 = tf.Variable(10, name='var')
print(data1)
print(data2)
sess = tf.Session()
print(sess.run(data1))
sess.run(tf.global_variables_initializer())
print(sess.run(data2))
2-12 tensorflow运算原理
下面内容只适用于tf1.x版本,tf2.x抛弃了张量,所以想要运行必须下载1.x版本。
import tensorflow as tf
data1 = tf.constant(2, dtype=tf.int32)
data2 = tf.Variable(10, name='var')
print(data1)
print(data2)
sess = tf.Session()
print(sess.run(data1))
'''
sess.run(tf.global_variables_initializer())
print(sess.run(data2))
sess.close() # 关闭会话,如果不用close,也可以用with进行关闭
# 本质 tf=tensor+计算图
# tensor数据
# op
# graphs数据操作
# session
'''
init = tf.global_variables_initializer()
sess = tf.Session()
with sess:
sess.run(init)
print(sess.run(data2))
2-13 常量变量四则运算
import tensorflow as tf
data1 = tf.constant(6)
data2 = tf.constant(2)
dataAdd = tf.add(data1, data2)
dataSub = tf.subtract(data1, data2)
dataMul = tf.multiply(data1, data2)
dataDiv = tf.divide(data1, data2)
with tf.Session() as sess:
print("data1+data2={}".format(sess.run(dataAdd)))
print("data1-data2={}".format(sess.run(dataSub)))
print("data1*data2={}".format(sess.run(dataMul)))
print("data1/data2={}".format(sess.run(dataDiv)))
print('end!')
运行结果为:
data1+data2=8
data1-data2=4
data1*data2=12
data1/data2=3.0
end!
上面都是常亮的加减乘除,下面修改一个值为变量进行加减乘除看看效果:
import tensorflow as tf
data1 = tf.constant(6)
# data2 = tf.constant(2)
data2 = tf.Variable(2) # 将data2改为变量
dataAdd = tf.add(data1, data2)
dataCopy = tf.assign(data2, dataAdd) # 将dataAdd的值复制给data2,这时data2为6+2=8
dataSub = tf.subtract(data1, data2)
dataMul = tf.multiply(data1, data2)
dataDiv = tf.divide(data1, data2)
init = tf.global_variables_initializer() # 存在变量,需要进行初始化
with tf.Session() as sess:
sess.run(init)
print("data1+data2={}".format(sess.run(dataAdd)))
print("data1-data2={}".format(sess.run(dataSub)))
print("data1*data2={}".format(sess.run(dataMul)))
print("data1/data2={}".format(sess.run(dataDiv)))
print("sess.run(dataCopy)=", sess.run(dataCopy)) # 值为8
print("dataCopy.eval()=", dataCopy.eval()) # 8+6=14->dataCopy
print("tf.get_default_session()=", tf.get_default_session().run(dataCopy)) # 14+6=20->dataCopy,和上面eval功能一样
print('end!')
运行结果为:
data1+data2=8
data1-data2=4
data1*data2=12
data1/data2=3.0
sess.run(dataCopy)= 8
dataCopy.eval()= 14
tf.get_default_session()= 20
end!
2-14 矩阵基础1
placeholder,中文意思是占位符,在tensorflow中类似于函数参数,运行时必须传入值。
import tensorflow as tf
data1 = tf.placeholder(tf.float32) # 这里通过placeholder先填坑
data2 = tf.placeholder(tf.float32)
dataAdd = tf.add(data1, data2)
with tf.Session() as sess:
# 通过feed_dict()函数向占位符喂入数据,用字典的方式填坑
print(sess.run(dataAdd, feed_dict={data1: 8, data2: 6}))
print('end')
运行结果:
14.0
end
以下是矩阵基础知识:
import tensorflow as tf
# 外面的中括号表示这是一个矩阵,里面的中括号表示这是几行几列
data1 = tf.constant([[8, 8]])
data2 = tf.constant([[2],
[2]])
data3 = tf.Variable(6, name='var')
print('data1:', data1) # 直接输出不会打印矩阵,输出的第一个表示常量还是变量,第二个表示形状,第三个表示类型
print('data2:{}'.format(data2)) # format用法和上面一样
data3 = tf.constant([[3, 3]])
data4 = tf.constant([[1, 3],
[2, 4],
[7, 8]])
print('data3.shape:', data3.shape)
print('data4.shape:', data4.shape)
with tf.Session() as sess:
print(sess.run(data4)) # 打印整体
print(sess.run(data4[1])) # 打印某一行
print(sess.run(data4[:, 0])) # :表示打印所有行,0表示打印第一列
print(sess.run(data4[0, 1])) # 0,1表示打印第1行第二列的数
print('end!')
运行结果:
data1: Tensor("Const:0", shape=(1, 2), dtype=int32)
data2:Tensor("Const_1:0", shape=(2, 1), dtype=int32)
data3.shape: (1, 2)
data4.shape: (3, 2)
[[1 3]
[2 4]
[7 8]]
[2 4]
[1 2 7]
3
end!
2-15 矩阵基础2
矩阵的广播在TensorFlow官方文档里面有介绍。
import tensorflow as tf
data1 = tf.constant([[6, 6]])
data2 = tf.constant([[2],
[3]])
data3 = tf.constant([[2, 2]])
data4 = tf.constant([[1, 2],
[4, 5],
[8, 9]])
# 相同维度的矩阵加法
matAdd = tf.add(data1, data3)
# 这里data1和data4的维度不同,用了广播的特性,将低维扩展成高维,data1变成data4相同维度,且每一行相同
matAdd2 = tf.add(data1, data4)
# 矩阵乘法,要满足矩阵相乘格式,即第一个矩阵列要和第二个矩阵行相同
matMul = tf.matmul(data1, data2)
# 这里乘法是将矩阵中对应元素各自相乘,不同维度用广播特性,并且数据类型必须相同,否则报错
matMul2 = tf.multiply(data1, data4)
with tf.Session() as sess:
print(sess.run(matAdd))
print(sess.run(matAdd2))
print(sess.run(matMul))
print(sess.run(matMul2))
运行结果如下:
[[8 8]]
[[ 7 8]
[10 11]
[14 15]]
[[30]]
[[ 6 12]
[24 30]
[48 54]]
2-16 矩阵基础3
一定要自己手敲,多动手,多思考,自己写一遍写多遍,代码如下:
import tensorflow as tf
# 这里定义了一个2行3列全0的矩阵,很麻烦
data1 = tf.constant([[0, 0, 0], [0, 0, 0]])
# 这里直接用zeros函数给定一个2行3列全0的矩阵,默认float32型,很简单
data2 = tf.zeros([以上是关于快速学完OpenCV+python计算机视觉图像处理的主要内容,如果未能解决你的问题,请参考以下文章