一、初始
配置:需要 pip install opencv-contrib-python
pip install numpy
在pycharm中配置好环境
#读入 cv2.inread()
#输出 cv2.imshow()
#暂停进程 cv2.waitKey()
#计算机视觉库
import cv2
#查看版本号
print(cv2.getVersionString())
#导入图片
image = cv2.imread("opencv_logo.jpg")#numpy数组维度类型
#查看图片参数
print(image.shape)#(像素横行,像素纵列,色彩通道)
#输出图片
cv2.imshow("image",image)#窗口名,变量名
#暂停等待 可以观察图片 在激活的窗口上输入任意键 结束
cv2.waitKey()
二、图像彩色通道color
# 存储一张彩色图片相当于三张灰度图,被存储在三个维度上,灰度范围0-255
# opencv对颜色的存储顺序是 BGR
#展示不同的色彩通道 cv2.imshow("red",image[:,:,2])
#输出灰度图 cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#color
import cv2
image = cv2.imread("opencv_logo.jpg")
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()
三、图像裁剪crop
# 索引号取出图像的一部分 image[x1:x2,y1:y2]
# 取得的范围是先 横行 再 纵列
#crop
import cv2
image = cv2.imread("opencv_logo.jpg")
#索引号取出图像的一部分
crop = image[10:170,40:200]#先横行后纵列
cv2.imshow("crop",crop)
cv2.waitKey()
四、图像绘制draw
# 需要numpy库
# 先创建黑色幕布 np.zeros([300,300,3],dtype=np.uint8)
#画线 cv2.line(draw,(x1,y1),(x2,y2),(#b,#g,#r),#width)
#画矩形 cv2.rectangle(draw,(x1,y1),(x4,y4),(#b,#g,#r),#width)
#画圆 cv2.circle(draw,(x,y),r,,(#b,#g,#r),#width)
#输出文本 cv2.putText(draw," ",(x,y),0,1,(#b,#g,#r),#width,0)
#draw
import cv2
import numpy as np
#创造一个300x300的黑色画布
draw = np.zeros([300,300,3],dtype=np.uint8)#无符号8位整数
#画线
cv2.line(draw,(100,200),(250,250),(255,0,0),2)#起点坐标,重点坐标,颜色,线段粗细
#画矩形
cv2.rectangle(draw,(30,100),(60,150),(0,255,0),2)#第1个顶点坐标,矩形的对角坐标,颜色,线段粗细
#画圆形
cv2.circle(draw,(150,100),20,(0,0,255),2)#圆心坐标,半径,颜色,线段粗细
#打印文字
cv2.putText(draw,"hello",(100,50),0,1,(255,255,255),2,0)#文字内容,坐标,字体序号,缩放系数,颜色,线段粗细,线条类型
cv2.imshow("draw",draw)
cv2.waitKey()
五、图像均值滤波blur
#高斯滤波 cv2.GaussianBlur()
#中值滤波 cv2.medianBlur()
#blur
import cv2
#用均值滤波器来处理图像中的噪点
image = cv2.imread("plane.jpg")
#高斯滤波器
gauss = cv2.GaussianBlur(image,(5,5),0)#高斯内核(ksize.width和ksize.height),sigmaX X方向上的高斯核标准偏差
#中值滤波器
median = cv2.medianBlur(image,5)#内核
#索引号取出图像的一部分
cv2.imshow("image",image)
cv2.imshow("gauss",gauss)
cv2.imshow("median",median)
cv2.waitKey()
六、图像特征提取corner
#需要灰度图像 cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#获取图像特征点 cv2.goodFeaturesToTrack()
#用ravel()方法将数组a拉成一维数组
#corner
import cv2
image = cv2.imread("opencv_logo.jpg")
#转化为灰度图
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#获取图像特征点
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("corners",image)
cv2.waitKey()
七、图像匹配match(1:1大小)
#需要numpy 灰度图
# cv2.matchTemplate()
#match
import cv2
import numpy as np
image = cv2.imread("poker.jpg")
#转化为灰度图
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#选取区域
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]
#循环遍历每一个匹配点,在原始图像上画出每一个矩形框
for p in zip(*locations[::-1]):
x1,y1 = p[0],p[1]
x2,y2 = x1+w,y1+h
cv2.rectangle(image,(x1,y1),(x2,y2),(0,255,0),2)
cv2.imshow("match",image)
cv2.waitKey()
八、图像梯度算法gradient
# 主要用来检测边缘
# 水平的明暗变化和垂直的明暗变化,相邻像素之差
# 得到的图像,均匀的地方是黑色,有变化的是白色
#laplacian cv2.Laplacian()
#canny cv2.Canny()
#gradient
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()
九、图像阈值(二值化)threshold
# 门槛下是黑色,门槛上是白色
# 把连续分布的灰度图,切割为黑和白
#需要灰度图
#全局二值化 cv2.threshold()
#局部二值化 cv2.adaptiveThreshold()
#OTSU算法 cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
#threshold
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, 1)#区域大小的像素,自适应阈值算法,阈值类型,邻域块大小
#最大类间方差法(OTSU)
# 聚类分析算法
# 自动计算恰当的阈值,使得两个灰度差异最大化
ret1,binary_ostu = 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_ostu",binary_ostu)
cv2.waitKey()
十、图像形态学之腐蚀和膨胀morphology
#需要numpy 灰度图 全局二值化
#需要卷积内核 np.ones((5,5),np.uint8)
#腐蚀 cv2.erode()
#膨胀 cv2.dilate()
#morphology
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()
十一、调用电脑摄像头camera
#捕捉特点 cv2.VideoCapture()
#capture.read()
#释放capture指针 capture.release()
#camera
capture = cv2.VideoCapture(0)#设备管理器 查看摄像头序号
#摄像是要循环读取每一帧的画面
#得到灰度图
while True:
ret,frame = capture.read()
cv2.imshow("camera",frame)
key = cv2.waitKey(1)#等待键盘输入,时间为1ms
#如果输入任意键,则值不为-1,就结束播放
if key != -1:
break
#释放capture指针
capture.release()