版本3.4.1
定义
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
基本操作
首先还是要将需要的库导入
import cv2
import matplotlib.pyplot as plt
import numpy as np
读取图片
image = cv2.imread('图片路径')
image =cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
上面的操作就是读取并输出了一张图片.注意第二步操作,因为读取默认是以BGR格式读取的,所以输出颜色会有点奇怪,所以要转换成RGB格式.
打印图片
plt.imshow(image)
plt.axis('off')#打印时不显示坐标轴
plt.show()
先前我们定义了一个image,直接输出即可.
因为每一步输出图片都会用到读取和输出这个操作,所以我们将这个操作封装成一个函数方便使用
def show(image):
plt.imshow(image)
plt.axis('off')
plt.show()
def imread(image):
image = cv2.imread(image)
image =cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
return image
下面演示的所有show函数都是用的这个封装好的函数
图片格式
print("height: %d" %(image.shape[0]))
print("width: %d" %(image.shape[1]))
print("channels: %d" %(image.shape[2]))
print(image.shape)
height: 353
width: 500
channels: 3
(353, 500, 3)
从这里我们可以得出格式是(高,宽,图片通道数(RGB)).
图片平移
M = np.float32([[1,0,100],[0,1,150]]) #1,0水平方向100 0,1竖直方向150,正号是往右,往下
shifted = cv2.warpAffine(image,M,(image.shape[1],image.shape[0]))
show(shifted)
我们先定义了一个列表表示图片需要平移的方向和大小,1,0表示水平方向,0,1表示垂直方向,后面是图片平移的值,正数是图片向右/向下平移.
随后使用cv2.warpAffine(图片,平移方向大小,宽,高)实现平移.
图片旋转
(h,w) = image.shape[0:2]
(cX,cY) = (w/2,h/2) #中点
M = cv2.getRotationMatrix2D((cX,cY),45,0.5)#旋转中心点 45° 缩放
image = cv2.warpAffine(image,M,(w,h))
show(image)
首先定义旋转中点,使用cv.getRotationMatrix2D((中点坐标),旋转角度,缩放比率),再使用cv2.warpAffine(图像,旋转操作,(宽,高))
重置大小
width = 125
height = 120
image = cv2.resize(image,(width,height))
show(image)
print("shape:",image.shape)
shape:(120, 125, 3)
#resize比较简单,定义了宽和高,直接使用resize就可以了.
画图
image = np.zeros((300,300,3),dtype='uint8')
show(image)
定义了一张长宽均为300,三通道的图片.
green = (0,255,0)
blue = (0,0,255)
cv2.line(image,(0,0),(300,300),green)#直线起始位置,终止位置 颜色/粗细 为-1填充
cv2.line(image,(300,0),(150,150),blue,5)
show(image)
先定义一个绿色一个蓝色
再用cv2.line(图片,(起点位置坐标值),(重点位置坐标值),颜色,线条粗细)即可实现画线.
red = (255,0,0)
cv2.rectangle(image,(10,10),(60,60),red,2) #左上 右下
show(image)
在刚才的基础上,再画了一个一个红色的矩形.
cv2.rectangle(图像,(矩形左上角坐标点),(矩形右下角坐标点),颜色,线条粗细).
(cX,cY) = image.shape[1]//2,image.shape[0]//2
white=(255,255,255)
for r in range(0,151,15):
cv2.circle(image,(cX,cY),r,white,2)
show(image)
先定义图片中心为圆心,这里用了一个循环去遍历半径的值,用cv2.circle(图片,(圆心作标),半径,颜色,线条粗细)即可实现画圆
图片翻转
image = cv2.flip(image,0)
翻转也很简单,用cv2.flip(图片,翻转方向)即可实现,翻转方向 0表示垂直翻转, 1表示水平翻转,-1是两个一起.
创建遮挡
image = imread('图片路径)
mask = np.zeros(image.shape,dtype='uint8')
white = (255,255,255)
cv2.circle(mask,(150,100),160,white,-1)
show(mask)
先画了一个圆.
masked = cv2.bitwise_and(image,mask)
show(masked)
cv2.bitwise_and()是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
形态学
腐蚀
image = imread('路径')
show(image)
读入一张新的图片
腐蚀会把前景物体的边界腐蚀掉(但是前景仍然是白色)。卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是1,那么中心元素就保持原来的像素值,否则就变为0。
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
for i in range(2):
erosion = cv2.erode(image,kernel,iterations=i+1)#腐蚀次数
show(erosion)
先定义了一个(5,5)的滤波器,再进行两次腐蚀。
腐蚀的作用是减少对象大小像素、平滑对象边缘。直观感受就是变暗。
膨胀
dilation = cv2.dilate(image,kernel)#取局部最大
show(dilation)
膨胀的作用是增大对象大小像素、平滑对象边缘。直观来看就是亮度增加、变白。
可以将膨胀看作白色区域扩大、腐蚀看作黑色区域扩大。
开运算
opening = cv2.morphologyEx(image,cv2.MORPH_OPEN,kernel)
show(opening)
先腐蚀、后膨胀 消除小白点。
闭运算
close = cv2.morphologyEx(image,cv2.MORPH_CLOSE,kernel)
show(close)
先膨胀,后腐蚀,消除小黑点。
梯度
gradient = cv2.morphologyEx(image,cv2.MORPH_GRADIENT,kernel)
show(gradient)
膨胀-腐蚀, 得出图片轮廓。
白帽
tophat = cv2.morphologyEx(image,cv2.MORPH_TOPHAT,kernel)
show(tophat)
白帽 原图-开运算 显示去除的白色。
黑帽
tophat = cv2.morphologyEx(image,cv2.MORPH_BLACKHAT,kernel)
show(tophat)
原图-闭运算 显示去除的黑色。
以上为一些基本的OpenCV会使用到的操作,如有错误请指正。