[图像识别]3.OpenCV的算术操作和几何变换

回顾 ,上节课你学到了什么

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)

 总结,这节课你学到了什么?


算术操作

1.图像加法

俩个图像必须具有相同的大小和类型,或者第二个图像为标量

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)

结果

[图像识别]3.OpenCV的算术操作和几何变换_第1张图片

[图像识别]3.OpenCV的算术操作和几何变换_第2张图片

可以看出cv.add()白色部分还是白色,应该最大像素值为255,而加号使得白色部分的像素值和%256取余,跟图二差不多

2.图像的混合

也是加法,但使用不同的权重,给人一种缓和,透明融合的感觉

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)

结果:

[图像识别]3.OpenCV的算术操作和几何变换_第3张图片

 几何变换

1.图像缩放

cv.resize(img,dsize,fx,fy,interplation)

dsize:绝对大小(W,H),不能出现小数点

fx,fz:dsize为None时,作为比例因子,按比例缩放

interplation:插值方法

[图像识别]3.OpenCV的算术操作和几何变换_第4张图片

举例

#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)

结果

[图像识别]3.OpenCV的算术操作和几何变换_第5张图片

2.图像平移

将图片平移到指定方向和距离

cv.warpAffine(img,M,dsize)

M:2X3移动矩阵

np.float32([[1,0,tx],[0,1,ty]])

[图像识别]3.OpenCV的算术操作和几何变换_第6张图片

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)

[图像识别]3.OpenCV的算术操作和几何变换_第7张图片

3. 图像旋转

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)

[图像识别]3.OpenCV的算术操作和几何变换_第8张图片

4.图像仿射变换

仿射变换原理,起码三个点构成的面的变换,通过点的变换到面的变换

[图像识别]3.OpenCV的算术操作和几何变换_第9张图片

旋转,平移,缩放,翻转的组合,也是通过cv.warpAffine()函数完成,只是矩阵M更复杂

[图像识别]3.OpenCV的算术操作和几何变换_第10张图片

仿射变换的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)

 结果

[图像识别]3.OpenCV的算术操作和几何变换_第11张图片

5.图像透射变换

[图像识别]3.OpenCV的算术操作和几何变换_第12张图片

[图像识别]3.OpenCV的算术操作和几何变换_第13张图片

投影变换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)

结果

[图像识别]3.OpenCV的算术操作和几何变换_第14张图片

6.图像金字塔 (image pyramid)

        图像金字塔是图像多尺度表达的-种,最主要用于图像的分割,是-种以多分辨率来解释图像的有效但概念简单的结构。
        图像金字塔用于机器视觉和图像压缩,-幅图像的金字塔是-系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。
        金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似,层级越高,图像越小,分辨率越低。

[图像识别]3.OpenCV的算术操作和几何变换_第15张图片

向上采样

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)

你可能感兴趣的:(黑马python,图像识别处理笔记,opencv,python,numpy,图像处理)