从零学OpenCV

中文文档: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)#自适应
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值