中文文档:https://www.woshicver.com/
英文文档:https://docs.opencv.org/4.5.3/index.html
写在最前:
#如果cv2没有自动补全功能,导入文件改写为:
import cv2.cv2 as cv
cv.imshow()
- 文件的导入
import cv2
import matplotlib.pyplot as plt
obj1 = cv2.imread('D:/QQfiles/web/web/xiaomi/images/1.jpg',0) #灰度图像
cv2.imshow('test',obj1)
cv2.waitKey(0) #从键盘获取事件
cv2.destroyAllWindows()
#使用matplotlib
plt.imshow(obj1,cmap = 'gray')
plt.show()
- 文件保存
cv2.imwrite('./img6.jpg',img6) #True
plt.savefig('1.png') #必须放在plt.show()之前,否则保存的图片为白色
- 图像类别
二值图:只有两种取值,黑或白
灰度图像:8位256种灰度值
真彩色图:RGB三通道,每个通道8位
假彩色图:8位表示256种颜色、
import random
import numpy as np
#随机生成三通道
a = np.random.randint(0,255,(222,222,3),dtype = np.uint8)#截断为0-255的整数
plt.imshow(a,cmap = 'gray',vmin = 0,vmax = 255)
plt.imshow(a)
plt.show()
- 图像通道的分离与合并
#分离,rgb排列
r,g,b = cv2.split(obj1)
plt.imshow(b) #相当于灰度图
#合并,plt按brg显示
obg2 = cv2.merge([b,g,r])
- 彩色图转换为灰度图
#方法一:手动计算
gray = 1/3 *r + 1/3 *g + 1/3 *b
gray = np.uint8(gray) #范围0- 255的整型
plt.imshow(gray,cmap = 'gray')
#方法二:调函数
img2 = cv2.cvtColor(obj2,cv2.COLOR_BGR2GRAY)
- 图像二值化
#方法一:
img2[img2>120] = 255
img2[img2<= 120] =0
plt.imshow(img2,cmap='gray')
#方法二:
ignore,img3 = cv2.threshold(img2,125,255,cv2.THRESH_BINARY)#大于125的换为255,
- 图像相加,相减,相乘,相除
#方法1:+ - * /
#方法二:
temp = cv2.add(np.uint8(obj1*0.5),np.uint8(obj2*0.5)
temp = cv2.addWeighted(obj1,0.5,obj2,0.5,0)#偏移值
temp = np.uint(cv2.subtract(obj1,obj2*0.5))
temp = cv2.multiply(obj1*1.0,obj2/255)
temp = cv2.divide(obj1,obj2+1)
- 线性变换
img = cv2.convertScaleAbs(obj1,alpha=2,beta=20)
plt.imshow(img,cmap='gray')
- 非线性变换
import numpy as np
img2 = 10+np.log(obj1.astype(np.float32)+1)/0.1
plt.imshow(img2,cmap='gray')
- gamma变换(y = c *x**r)
obj1 = obj1 /255
img0_5 = np.power(obj1,0.5) *255
img1_5 = np.power(obj1,1.5) *255
plt.imshow(np.hstack([img0_5,img1_5]),cmap='gray')
- 图像的几何变换
#放缩
img4 = cv2.resize(obj1,(1200,3000),interpolation=cv2.INTER_NEAREST)
plt.imshow(img4,cmap='gray')
#平移
M = np.array([
[1,0,100],
[0,1,50]
],dtype=np.float32)
img2 = cv2.warpAffine(obj1,M,(2000,300))
plt.imshow(img2,cmap = 'gray')
#错切
N = np.array([
[1,np.tan(10),0],
[0,1,0]
],dtype = np.float32)
img2 = cv2.warpAffine(obj1,N,(2000,-1))
plt.imshow(img2,cmap = 'gray')
#镜像-------
T = np.array([
[-1,0,obj1.shape[1]],
[0,1,0]
],dtype = np.float32)
img3 = cv2.warpAffine(obj1,T,(2000,460))
#调函数
img = cv2.flip(obj1,-1)#0水平,1垂直,-1均有
plt.imshow(img, cmap='gray')
#旋转-------
bate = -np.pi /10
C = np.array([
[np.cos(bate),np.sin(bate),0],
[-np.sin(bate),np.cos(bate),0]
],dtype = np.float32)
img4 = cv2.warpAffine(obj1,C,(2000,500))
plt.imshow(img4,cmap = 'gray')
#调函数
C = cv2.getRotationMatrix2D((500,200),90,1)#旋转中心,旋转角度,放缩比例
img5 = cv2.warpAffine(obj1,C,(2000,500))
plt.imshow(img5,cmap = 'gray')
#只限于90度的倍数
img6 = cv2.rotate(obj1,cv2.ROTATE_180)#顺时针旋转180度
plt.imshow(img6,cmap='gray')
- 图像的透视变换(边界不平行):图片矫正
src = np.array([
[200,100],
[200,300],
[450,100],
[450,300]
],dtype= np.float32)#原图的特征点
dst = np.array([
[200,100],
[350,300],
[450,100],
[500,300]
],dtype= np.float32)#新图的特征点
M = cv2.getPerspectiveTransform(src,dst)
img7 = cv2.warpPerspective(img6,M,(img6.shape[1],img6.shape[0]))
plt.imshow(img7,cmap='gray')
- 图像插值
img1 = cv2.resize(obj1,(1500,300),interpolation = cv2.INTER_LINEAR)#双线性插值
img2 = cv2.resize(obj1,(1500,300),interpolation = cv2.INTER_NEAREST)#最近邻插值
- 卷积核,滤波器,算子
image = np.ones((5,5))
kernel = np.ones((3,3))#卷积核
img1 = cv2.filter2D(image,-1,kernel) #-1和原图等大
print(img1)
[[9. 9. 9. 9. 9.]
[9. 9. 9. 9. 9.]
[9. 9. 9. 9. 9.]
[9. 9. 9. 9. 9.]
[9. 9. 9. 9. 9.]]
- 均值模糊
img2 = cv2.blur(obj1,(3,3))
print(img2)
img2 = cv2.boxFilter(obj1,-1,(3,3))
print(img2)
[[187 187 187 ... 162 162 162]
[187 187 187 ... 162 162 162]
[187 187 187 ... 162 162 162]
- 中值滤波
img2 = cv2.medianBlur(np.uint8(img1),3)
- 高斯模糊
img3 = cv2.GaussianBlur(obj1,(3,3),sigmaX = 1) #默认sigmaY = sigmaX
- 双边滤波,保留边缘的高频特征 颜色差异越大。距离越远,加权值越小
img3 = cv2.bilateralFilter(obj1,-1,sigmaColor = 50,sigmaSpace = 30)
- premitt算子
kx = np.array([
[-1,-1,-1],
[0,0,0],
[1,1,1]
])
ky = np.array([
[1,0,-1],
[1,0,-1],
[1,0,-1],
])
img1 = cv2.filter2D(obj3,cv2.CV_64F,kx)
plt.imshow(np.abs(img1),cmap='gray')
plt.show()
img2 = cv2.filter2D(obj3,cv2.CV_64F,ky)
plt.imshow(np.abs(img2).clip(0,255),cmap='gray')
plt.show()
img3 = np.sqrt(img1**2+img2**2)
plt.imshow(img3,cmap= 'gray')
plt.show()
- Robber算子
rx = np.array([
[1,0],[0,-1]
])
ry = np.array([
[0,1],[-1,0]
])
img1 = cv2.filter2D(obj3,cv2.CV_64F,rx)
plt.imshow(np.abs(img1),cmap='gray')
plt.show()
plt.imshow(np.abs(img2).clip(0,255),cmap='gray')
plt.show()
- sobel算子
img1 = cv2.Sobel(obj3,cv2.CV_64F,1,0)
img2 = cv2.Sobel(obj3,cv2.CV_64F,0,1)
- scharr算子
img1 = cv2.Scharr(obj3,cv2.CV_64F,1,0)
img2 = cv2.Scharr(obj3,cv2.CV_64F,0,1)
- laplacian算子和loG算子
img1 = cv2.Laplacian(obj4,cv2.CV_64F)
img_log =cv2.GaussianBlur(obj4,(3,3),sigmaX = 1)
img2 = cv2.Laplacian(img_log,cv2.CV_64F)
- Canny边缘检测算法
img5 = cv2.Canny(obj4,0,255)
- 图像阈值
cv2.threshold(img1,th,255,cv2.THRESH_BINARY)#直方图阈值
cv2.threshold(img1,th,255,cv2.THRESH_TRIANGLE)#三角阈值
cv2.threshold(img,th,255,cv2.THRESH_OTSU) #大津法
cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,7,0)#自适应