import 库名称 as 自定义名称
图像变量=cv2.imread("图片路径名",参数1)
cv2.imshow("窗口名",图像变量)
cv2.imwrite("图像路径名",图像变量)
cv2.line(img,start,end,color,thickness)
cv2.circle(img,centerpoint,r,color,thickness)
cv2.rectangle(img,leftupper,rightdown,thickness)
cv2.putText(img,text,station,font,fontsize,color,thickness)
img[x,y,c]=color
print(pic.shape)
print(pic.size)
print(pic.dtype)b,g,r=cv2.split(img)
img=cv2.merge((b,g,r))
cv2.cvtColor(img,flag)
目录
算术操作
1.图像加法
2.图像的混合
几何变换
1.图像缩放
2.图像平移
3. 图像旋转
4.图像仿射变换
5.图像透射变换
6.图像金字塔 (image pyramid)
总结,这节课你学到了什么?
俩个图像必须具有相同的大小和类型,或者第二个图像为标量
res=cv.add(img1,img2) opencv
res=img1+img2 numpy
注意:Opencv中加法是饱和操作(即超过最大值为最大值),numpy添加是模运算(超过最大值取余)
为了使得图像尺寸改变大小
img=cv.resize(img,(W,H))
W:图像宽度
H:图像高度
举例
#2.1
import cv2 as cv pic1 = cv.imread("1.jpeg") pic2 = cv.imread("2.jpeg") print(pic1.shape) print(pic2.shape) pic2=cv.resize(pic2,(360,720))#改变图片尺寸 print(pic2.shape) res1=cv.add(pic1,pic2) #超过255取255 res2=pic1+pic2 #超过255取余 cv.imshow("1",pic1) cv.imshow("2",pic2) cv.imshow("cv",res1) cv.imshow("+号",res2) cv.waitKey(0)
结果
可以看出cv.add()白色部分还是白色,应该最大像素值为255,而加号使得白色部分的像素值和%256取余,跟图二差不多
也是加法,但使用不同的权重,给人一种缓和,透明融合的感觉
cv.addWeighted(img1,p1,img2,p2,k)
相当于像素值公式res=p1*img1+p2*img2+k
p:权重0-1,之间
k:常数
举例
#2.2
import cv2 as cv pic1 = cv.imread("1.jpeg") pic2 = cv.imread("2.jpeg") print(pic1.shape) print(pic2.shape) pic2=cv.resize(pic2,(360,720)) print(pic2.shape) res1=cv.add(pic1,pic2) #超过255取255 res2=pic1+pic2 #超过255取余 cv.imshow("1",pic1) cv.imshow("2",pic1) cv.imshow("cv",res1) cv.imshow("+号",res2) cv.waitKey(0)
结果:
cv.resize(img,dsize,fx,fy,interplation)
dsize:绝对大小(W,H),不能出现小数点
fx,fz:dsize为None时,作为比例因子,按比例缩放
interplation:插值方法
举例
#2.3
import cv2 as cv pic1 = cv.imread("1.jpeg") #获取H,W H,W=pic1.shape[:2] res=cv.resize(pic1,(W*2,H*2),cv.INTER_AREA) cv.imshow("img",pic1) cv.imshow("resize",res) cv.waitKey(0)
结果
将图片平移到指定方向和距离
cv.warpAffine(img,M,dsize)
M:2X3移动矩阵
np.float32([[1,0,tx],[0,1,ty]])
x方向移动tx,y方向移动ty
dsize:输出图像绝对大小(W,H)
举例
#2.4
import cv2 as cv import numpy as np pic1 = cv.imread("1.jpeg") #获取H,W H,W=pic1.shape[:2] #移动矩阵 M=np.float32([[1,0,100],[0,1,200]]) res=cv.warpAffine(pic1,M,(W,H)) cv.imshow("img",pic1) cv.imshow("warpAffine",res) cv.waitKey(0)
M=cv.getRotationMatrix2D(center,angle,scale)
center:旋转中心
angle:旋转角度
scale:缩放比例
M:旋转矩阵(matrix)
调运cv.warpAffine(img,M,(W,H))函数完成旋转
举例
#2.5
import cv2 as cv import numpy as np pic1 = cv.imread("1.jpeg") #获取H,W H,W=pic1.shape[:2] #旋转矩阵 M=np.float32([[1,0,100],[0,1,200]]) res=cv.warpAffine(pic1,M,(W,H)) cv.imshow("img",pic1) cv.imshow("warpAffine",res) cv.waitKey(0)
仿射变换原理,起码三个点构成的面的变换,通过点的变换到面的变换
旋转,平移,缩放,翻转的组合,也是通过cv.warpAffine()函数完成,只是矩阵M更复杂
仿射变换的M矩阵通过一下函数获得
M=cv.getAffineTransform(pts1,pts2)
pts:点集合np.float32([[x1,y1],[x2,y2],[x3,y3]])三个点不共线
举例
#2.6
import cv2 as cv import numpy as np pic1 = cv.imread("2.jpeg") #获取H,W H,W=pic1.shape[:2] pts1=np.float32([[0,0],[100,0],[0,100]]) pts2=np.float32([[0,0],[200,0],[100,100]]) #仿射变换矩阵 M=cv.getAffineTransform(pts1,pts2) res=cv.warpAffine(pic1,M,(W,H)) cv.imshow("img",pic1) cv.imshow("Affine",res) cv.waitKey(0)
结果
投影变换3x3矩阵通过以下获得
M=getPerspectiveTransform(pts1,pts2)
pts:点集合np.float32([[x1,y1],[x2,y2],[x3,y3],[x4,y4]])四个点,其中三个点不共线
将获得的矩阵放入以下投影变换函数中获得投影结果
res=cv.warpPerspective(img,M,(W,H))
W:宽度
H:高度
举例:
#2.7
import cv2 as cv import numpy as np pic1 = cv.imread("2.jpeg") #获取H,W H,W=pic1.shape[:2] pts1=np.float32([[0,0],[100,0],[0,100],[100,100]]) pts2=np.float32([[10,0],[80,10],[20,90],[80,80]]) #投影变换矩阵 M=cv.getPerspectiveTransform(pts1,pts2) res=cv.warpPerspective(pic1,M,(W,H)) cv.imshow("img",pic1) cv.imshow("Perspective",res) cv.waitKey(0)
结果
图像金字塔是图像多尺度表达的-种,最主要用于图像的分割,是-种以多分辨率来解释图像的有效但概念简单的结构。
图像金字塔用于机器视觉和图像压缩,-幅图像的金字塔是-系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。
金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似,层级越高,图像越小,分辨率越低。
向上采样
img=cv.pyrUp(img)
向下采样
img=cv.pyrDown(img)
举例
#2.8
import cv2 as cv import numpy as np pic1 = cv.imread("2.jpeg") #向上采样 uppic=cv.pyrUp(pic1) #向下采样 downpic=cv.pyrDown(pic1) cv.imshow("img",pic1) cv.imshow("up",uppic) cv.imshow("down",downpic) cv.waitKey(0)
结果
res=cv.add(img1,img2)
res=img1+img2
cv.addWeighted(img1,p1,img2,p2,k)
cv.resize(img,dsize,fx,fy,interplation)
M=cv.getRotationMatrix2D(center,angle,scale)
M=cv.getAffineTransform(pts1,pts2)
M=getPerspectiveTransform(pts1,pts2)
cv.warpAffine(img,M,dsize)
cv.warpPerspective(img,M,(W,H))
img=cv.pyrUp(img)
img=cv.pyrDown(img)