-----------------------------------------------------------------------------参考教程OpenCV轻松如man:面向python 李立宪------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
opencv基础环境搭建
将对应安装包从官网下载好版本:python3 、opencv3、 pycharm
pip install opencv-python
pip install opencv-contrib-python//扩展模块
pip install pytesseract//谷歌开源的OCR的引擎
opencv模块
opencv模块 | 扩展模块 | ||||||||||
视频分析 | 2D特征提取 | 机器学习 | 异构与并行计算 | 图像拼换 | 超分辨 | 相机矫正与三维重建 | 分割与匹配 | 深度神经网络 | 三维可视化 | 对象检测 | |
Image processing | Hight-level GUI:窗口和图片显示 | ||||||||||
Core:像素级别的运算和操作 | |||||||||||
Imgcodecs:图像的读写 | VideoI/O:视频的读写 | ||||||||||
图像是由像素构成的
图像分类:
读取像素:返回值=(位置参数)
//灰度图像,返回灰度值。
p = img[88,142]//在名为img的图像中提取第88行,142列的像素的值
print(p)
//BGR图像,返回B、G、R的值
p=img[78,125]//在名为img的图像中提取78行,125列的像素的值
print(p)//返回值为三个值
//BGR图像,分别返回B、G、R的值
blue=img[78,125,0]//在名为img的图像中提取第78行125列第0个通道
print(blue)//B通道上的像素值
green=img[78,125,0]
print(green)//G通道的像素值
red=img[78,125,0]
print(red)//R通道上的像素值
修改像素
import cv2//导入CV2的库
i = cv2.imread("D:\\lesson\\image\\test.bmp",cv2.IMREAD_UNCHANGED)//导入图片:用CV2的imread的方法读入该E盘的test.bmp文件,读入类型为.IMREAD_UNCHANGED即不更改原图片类型
p=i[100,100]//读取i图片的第100行100列的像素的值
print(p)//输出p的值
i[100,100]=255//更改i图片的第100行第100列的像素的值为255
p=i[100,100]//再次将像素值赋值给p
print(p)//输出p的值
//不赋值到变量上直接打印
import cv2//导入CV2的库
i = cv2.imread("D:\\lesson\\image\\test.bmp",cv2.IMREAD_UNCHANGED)//导入图片:用CV2的imread的方法读入该E盘的test.bmp的灰度图像,读入类型为.IMREAD_UNCHANGED即不更改原图片类型
print(i[100,100])//直接打印第100行100列的像素的值
i[100,100]=255//更改第100行100列的像素的值为255
print(i[100,100])//直接输出第100行100列的像素的值
import cv2//导入CV2的库
i = cv2.imread("D:\\lesson\\image\\test.png",cv2.IMREAD_UNCHANGED)//导入图片:用CV2的imread的方法读入该E盘的test.png的彩色图像,读入类型为.IMREAD_UNCHANGED即不更改原图片类型
print(i[100,100])
i[100,100,2]=255
print(i[100,100])
import cv2//导入CV2的库
i = cv2.imread("D:\\lesson\\image\\test.png",cv2.IMREAD_UNCHANGED)//导入图片:用CV2的imread的方法读入该E盘的test.png的彩色图像,读入类型为.IMREAD_UNCHANGED即不更改原图片类型
cv2.imshow("original",i)
i[100:150,100:150]=[255,255,255]//i图片的第100行到150行,第100列到150列的像素值都更改为255,255,255
cv2.imshow("result",i)
cv2.waitKey(0)
cv2.destoryAllWindows()
读取像素:返回值=图像.item(位置参数)
//灰度图像,返回灰度值
p=img.item(88,142)//用numpy中item提取img图片第88行142列的像素值
print(p)//返回p的值
//BGR图像,返回值为B、G、R的值
blue=img.item(78,125,0)//用numpy中item提取img图片的第78行125列0通道的像素值
green=img.item(78,125,1)//用numpy中item提取img图片的第78行125列1通道的像素值
red=img.item(78,125,2)//用numpy中item提取img图片的第78行125列2通道的像素值
print(blue)
print(green)
print(red)
修改像素:图像名.itemset(位置,新值)
//灰度图像
import cv2
import numpy as np
i=cv2.imread("image\test.bmp",cv2.IMREAD_UNCHANGED)//导入图片:用cv2的imread方法读取test.bmp的灰度图像,读入类型为.IMREAD_UNCHANGED即不更改原图片类型.
print(i.item(100,100))
i.itemset((100,100),255)
print(i.item(100,100))
//BGR图像
import cv2
import numpy as np
i=cv2.imread("image\test.png",cv2.IMREAD_UNCHANGED)//导入图片:用cv2的imread方法读取test.png的彩色图像,读入类型为.IMREAD_UNCHANGED即不更改原图片类型.
print(i,item(100,100,0))//用numpy中item提取i图像的第100行第100列0通道
i.itemset((100,100,0),255)
print(i.item(100,100,0))
print(i,item(100,100,1))
i.itemset((100,100,1),255)
print(i.item(100,100,1))
print(i,item(100,100,2))
i.itemset((100,100,2),255)
print(i.item(100,100,2))
形状:shape可以获取图像的形状,返回包含行数、列数、通道数的元组。
像素数目:size可以获取图像的像素数目。
图像类型:dtype返回的是图像的数据类型。
import cv2
a=cv.imread("img\test.bmp",cv2.IMREAD_UNCHANGED)
b=cv2.imread("img\test.png"cv2.IMREAD_UNCHANGED)
print(a.shape)
print(b.shape)
print(a.size)
print(b.size)
print(a.dtype)
print(b.dtype)
###图像ROI
图像ROI:图像的感兴趣区域。
import cv2
import numpy as np
a=cv2.imread("img\test.png")
b=np.ones((101,101,3))//生产一个新的感兴趣区域,创建一个3通道行为101列为101
b=a[220:400,250:350]
a[0:180,0:100]=b
cv2.imshow("original",a)//显示窗口名字为original 图片为a
cv2.imshow("face",b)//显示窗口名字为face图像为b
cv2.waitKey()
cv2.destoryAllWindows()
import cv2
import numpy as np
a=cv2.imread("img\test.png")
c=cv2.imread("img\test.bmp")
b=np.ones((101,101,3))//生产一个新的感兴趣区域,创建一个3通道行为101列为101
b=a[220:400,250:350]
c[0:180,0:100]=b
cv2.imshow("original",c)//显示窗口名字为original 图片为c
cv2.waitKey()
cv2.destoryAllWindows()
拆分
合并
import cv2
a=imread("img\test.png")
b,g,r=cv2.split(a)
cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
m=cv2.merge([b,g,r])
//m=cv2.merge([r,g,b])
cv2.imshow("merge",m)
cv2.waiKey()
cv2.destroyAllWindows()
import cv2
import numpy as np
a=imread(“img\test.png”)
rows,cols,chn=a.shape//求a图像的行列大小
b,=cv2.split(a)[0]
g=np.zreo((rows,cols),a.dtype)//生成一个与a行列大小一样的空通道,且类型相等
r=np.zreo((rows,cols),a.dtype)//生成一个与a行列大小一样的空通道,且类型相等
m=cv2.merge([b,g,r])
cv2.imshow(“merge”,m)
cv2.waiKey()
cv2.destroyAllWindows()
Numpy加法
参与运算的图像大小、类型必须一致
import cv2
import numpy as np
a=cv2.imread("image\test.bmp")
b=a
add1=a+b
add2=cv2.add(a,b)
cv2.imshow("original",a)
cv2.imshow("add1",add1)
cv2.imshow("add2",add2)
cv2.waitKey()
cv2.destroyAllWindows()
图像融合
结果图像=图像1权重系数1+图像2权重系数2=亮度调节量
img=img0.3+img0.7=18
函数addWeighted
dst=cv.addWeighted(src1,alpha,src2,beta,gamma)
dst = src1alpha + src2beta + gamma;//运算公式
参数gamma不能省略,gamma=0 即不进行亮度调节
import cv2
import numpy as np
a=cv2.imread("image\test1.bmp")
b=cv2.imread("image\test2.bmp")
result=cv2.addWeighted(a,1,b,1,0)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.imshow("result",result)
cv2.waitKey()
cv2.destroyAllWindows()
图像类型转换
import cv2
a=cv2.imread("image\\test.png")
b=cv2.cvtColor(a,cv2.COLOR_BGR2GRAY)
cv2.imshow("test",a)
cv2.imshow("gray",b)
cv2.waitKey()
cv2.destoryWindows()
import cv2
a=cv2.imread("image\\test.png")
b=cv2.cvtColor(a,cv2.COLOR_BGR2RGB)
cv2.imshow("test",a)
cv2.imshow("rgb",b)
cv2.waitKey()
cv2.destoryWindows()
import cv2
a=cv2.imread("image\\test.bmp",cv2.IMREAD_UNCHANGED)
b=cv2.cvtColor(a,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray",a)
cv2.imshow("bgr",b)
cv2.waitKey()
cv2.destoryAllWindows()
resize函数
dst=cv2.resize(src,dsize[,dst[,fx[,fy[,interpolation]]]])
src:原始图像
dsize:缩放大小(列,行)
fx,fy:在不使用dsize缩放时即dsize= None在x轴y轴分别的缩放大小。(列,行)通过round进行对行、列取整。
dsize与fx、fy有一个即可
import cv2
a=cv2.imread("image\\test.png")
b=cv2.resize(a,(200,100))
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
import cv2
a=cv2.imread("image\\test.png")
rows,cols,chn=a.shape
size= ((round(cols*0.5),round(rows*1.5))
b=cv2.resize(a,size)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
import cv2
a=cv2.imread("image\\test.png")
rows,cols,chn=a.shape
b=cv2.resize(a,None,fx=0.5,fy=1.3)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
flip函数
dst = cv2.filp(src,filpCode)
src:源文件
filpCode:值为0是以x轴为对称轴翻转、值为大于0以y轴为对称轴翻转、值小于0在x轴y轴方向同时翻转
import cv2
a=cv2.imread("image\\test.png")
b=cv2.filp(a,0)
cv2.imshow("test",a)
cv2.imshow("test",b)
cv2.waitKey()
cv2.destroyAllWindows()
二进制阈值化:cv2.THRESH_BINARY
先要选定一个特定的阈值量,如177.新的阈值产生规律为大于等于177的像素点的灰度值设定为最大值 (如8位灰度值最大值为255)灰度小于177的像素点的灰度值设定为0.
反二进制阈值化:cv2.THRESH_BINARY_INV
该阈值化与二进制阈值化相似,先选定一个特定的灰度作为阈值,以8为灰度图为例,大于阈值的设定为0,小于该阈值的设定为255.
截断阈值化:cv2.THRESH.TRUNC
需要选定一个阈值,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变。
反阈值化为0:cv2.THRESH_TOZERO_INV
先选定一个阈值,然后对图像做如下处理,大于等于阈值的像素点变为0,小于该阈值的像素点保持不变。
阈值化为0:cv2.THRESH_TOZERO
先选定一个阈值,然后对图像进行如下处理,大于等于阈值的像素点,值保持不变,小于该阈值的像素点,值变为0.
threshold及实现
retval,dst=cv2threshold(src,thresh,maxval,type)
retval:阈值
dst:处理结果
src:,源图像
thresh:,阈值
maxval:,最大值
type:,类型
import cv2
a=cv2.imread("image\\test.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,128,255,cv2.THRESH_BINARY)
cv2.imshow("original",a)
cv2.imshow("result",b)
cv2.waitKey()
cv2.destroyAllWindows()
均值滤波
任意一点的像素值,都是周围NN个像素值的均值。
原始图像核=滤波结果图像
函数blur
处理结果=cv2.blur(原始图像,核大小)
import cv2
a= cv2.imread("image\\test.png")
r=cv2.blur(o,(5,5))
cv2.imshow("original",a)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
函数boxFilter
处理结果=cv2.boxFilter(原始图像,目标图像深度,核大小,normalize属性)
目标图像深度:int类型的目标深度。通常使用“-1”表示与原始图像一致。
normalize属性:是否对目标图像进行归一化处理。值为true,与均值滤波相同,值为false,就是求和,很容易发生溢出现象。默认为进行归一化处理。
import cv2
a=cv2.imread("image\\test.png")
r=cv2.boxFILTER(a,-1,(5,5))
cv2.imshow("original",a)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()