当前位置:   article > 正文

【OpenCV 图像基础】2.2图像基本处理:图像几何变换_img.shape[:2]

img.shape[:2]

目录

1.图像平移

2.图像缩放 

2.1上采样和下采样 

​2.2插值法 

2.2.1最近邻插值

 2.2.2双线性插值 

2.3代码实现 

3.图像旋转

4.仿射变换 

5.透视变换 

6.几何变换小结 

6.1例1:文档矫正

6.2例2:图像几何变化


1.图像平移

代码: 

  1. import cv2
  2. import numpy as np
  3. img = cv2.imread('img2.png')
  4. # 构造移动矩阵H
  5. # 在x轴方向移动多少距离,在y轴方向移动多少距离
  6. H = np.float32([[1, 0, 50], [0, 1, 25]])
  7. rows, cols = img.shape[:2]
  8. print(img.shape)
  9. print(rows, cols)
  10. # 注意这里rows和cols需要反置,即先列后行
  11. res = cv2.warpAffine(img, H, (cols, rows))
  12. cv2.imshow('origin_picture', img)
  13. cv2.imshow('new_picture', res)
  14. cv2.waitKey(0)
  15. cv2.destroyAllWindows()

输出: 

  1. (297, 221, 3)
  2. 297 221

  平移后: 

2.图像缩放 

2.1上采样和下采样 

2.2插值法 

图像放缩 

插值法 

2.2.1最近邻插值

举个栗子: 

 2.2.2双线性插值 

举个栗子: 

2.3代码实现 

代码: 

  1. import cv2
  2. import numpy as np
  3. img = cv2.imread('img2.png')
  4. # 方法一:通过设置缩放比例,来对图像进行放大或缩小
  5. res1 = cv2.resize(img, None, fx=2, fy=2,
  6. interpolation=cv2.INTER_CUBIC)
  7. height, width = img.shape[:2]
  8. # 方法二:直接设置图像的大小,不需要缩放因子
  9. #cv2.INTER_NEAREST(最近邻插值) cv2.INTER_AREA (区域插值) cv2.INTER_CUBIC(三次样条插值) cv2.INTER_LANCZOS4(Lanczos插值)
  10. res2 = cv2.resize(img, (int(0.8*width), int(0.8*height)),interpolation=cv2.INTER_LANCZOS4)
  11. cv2.imshow('origin_picture', img)
  12. cv2.imshow('res1', res1)
  13. # cv2.imshow('res2', res2)
  14. cv2.waitKey(0)
  15. cv2.destroyAllWindows()

方法一输出: 

方法二输出: 

3.图像旋转

代码: 

  1. import cv2
  2. import numpy as np
  3. img=cv2.imread('img2.png',1)
  4. rows,cols=img.shape[:2]
  5. #参数1:旋转中心,参数2:旋转角度,参数3:旋转因子,正为逆时针,负值为顺时针
  6. M=cv2.getRotationMatrix2D((cols/2,rows/2),45,-1,)
  7. print(M)
  8. #第三个参数是输出图像的尺寸中心
  9. dst=cv2.warpAffine(img,M,(cols,rows))
  10. #dst=cv2.warpAffine(img,M,(cols,rows),borderValue=(255,255,255))
  11. while(1):
  12. cv2.imshow('img', img)
  13. cv2.imshow('img1',dst)
  14. #0xFF==27 ESC
  15. if cv2.waitKey(1)&0xFF==27:
  16. break
  17. cv2.destroyAllWindows()

输出:

4.仿射变换 

代码: 

  1. import cv2
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. #读取图片
  5. src = cv2.imread('bird.png')
  6. #获取图像大小
  7. rows, cols = src.shape[:2]
  8. #设置图像仿射变换矩阵
  9. pos1 = np.float32([[50,50], [200,50], [50,200]])
  10. pos2 = np.float32([[10,100], [200,50], [100,250]])
  11. M = cv2.getAffineTransform(pos1, pos2)
  12. print(M)
  13. #图像仿射变换
  14. result = cv2.warpAffine(src, M, (2*cols, 2*rows))
  15. #显示图像
  16. cv2.imshow("original", src)
  17. cv2.imshow("result", result)
  18. #等待显示
  19. cv2.waitKey(0)
  20. cv2.destroyAllWindows()

 输出: 

  1. [[ 1.26666667 0.6 -83.33333333]
  2. [ -0.33333333 1. 66.66666667]]

5.透视变换 

代码: 

  1. import cv2
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. #读取图片
  5. src = cv2.imread('bird.png')
  6. #获取图像大小
  7. rows, cols = src.shape[:2]
  8. #设置图像透视变换矩阵
  9. pos1 = np.float32([[114, 82], [287, 156],
  10. [8, 100], [143, 177]])
  11. pos2 = np.float32([[0, 0], [188, 0],
  12. [0, 262], [188, 262]])
  13. M = cv2.getPerspectiveTransform(pos1, pos2)
  14. #图像透视变换
  15. result = cv2.warpPerspective(src, M, (2*cols,2*rows))
  16. #显示图像
  17. cv2.imshow("original", src)
  18. cv2.imshow("result", result)
  19. #等待显示
  20. cv2.waitKey(0)
  21. cv2.destroyAllWindows()

输出: 

6.几何变换小结 

6.1例1:文档矫正

代码:

  1. #encoding:utf-8
  2. import cv2
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. #读取图片
  6. src = cv2.imread('paper.png')
  7. #获取图像大小
  8. rows, cols = src.shape[:2]
  9. #将源图像高斯模糊,去除图像中的噪声
  10. img = cv2.GaussianBlur(src, (3,3), 0)
  11. #进行灰度化处理
  12. gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  13. #边缘检测(检测出图像的边缘信息)
  14. edges = cv2.Canny(gray,50,250,apertureSize = 3)
  15. cv2.imwrite("canny.jpg", edges)
  16. cv2.imshow("canny", edges)
  17. #通过霍夫变换得到A4纸边缘
  18. lines = cv2.HoughLinesP(edges,1,np.pi/180,50,minLineLength=90,maxLineGap=10)
  19. print(lines)
  20. #下面输出的四个点分别为四个顶点
  21. for x1,y1,x2,y2 in lines[0]:
  22. print(x1,y1)
  23. print(x2,y2)
  24. for x3,y3,x4,y4 in lines[1]:
  25. print(x3,y3)
  26. print(x4,y4)
  27. #绘制边缘
  28. for x1,y1,x2,y2 in lines[0]:
  29. cv2.line(gray, (x1,y1), (x2,y2), (0,0,255), 1)
  30. #根据四个顶点设置图像透视变换矩阵
  31. pos1 = np.float32([[114, 82], [287, 156], [8, 322], [216, 333]])
  32. pos2 = np.float32([[0, 0], [188, 0], [0, 262], [188, 262]])
  33. M = cv2.getPerspectiveTransform(pos1, pos2)
  34. # pos1 = np.float32([[114, 82], [287, 156], [8, 322]])
  35. # pos2 = np.float32([[0, 0], [188, 0], [0, 262]])
  36. # M = cv2.getAffineTransform(pos1,pos2)
  37. print(M)
  38. #图像仿射变换
  39. #result = cv2.warpAffine(src, M, (2*cols, 2*rows))
  40. #图像透视变换
  41. result = cv2.warpPerspective(src, M, (190, 272))
  42. #显示图像
  43. cv2.imshow("original", src)
  44. cv2.imshow("result", result)
  45. cv2.imshow("gray", gray)
  46. #等待显示
  47. cv2.waitKey(0)
  48. cv2.destroyAllWindows()

输出: 

  1. [[[ 8 332 114 82]]
  2. [[217 330 287 155]]
  3. [[ 8 333 160 392]]
  4. [[116 83 286 155]]
  5. [[255 20 294 136]]
  6. [[ 9 331 84 154]]]
  7. 8 332
  8. 114 82
  9. 217 330
  10. 287 155
  11. [[ 5.66589226e-01 2.50243575e-01 -8.51111449e+01]
  12. [-3.46690724e-01 8.10506692e-01 -2.69388062e+01]
  13. [-1.14188388e-03 -3.35875357e-04 1.00000000e+00]]

6.2例2:图像几何变化

代码: 

  1. #encoding:utf-8
  2. import cv2
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. #读取图片
  6. img = cv2.imread('test2.png')
  7. image = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
  8. #图像平移矩阵
  9. M = np.float32([[1, 0, 80], [0, 1, 30]])
  10. rows, cols = image.shape[:2]
  11. img1 = cv2.warpAffine(image, M, (cols, rows))
  12. #图像缩小
  13. img2 = cv2.resize(image, (200,100))
  14. #图像放大
  15. img3 = cv2.resize(image, None, fx=1.1, fy=1.1)
  16. #绕图像的中心旋转
  17. #源图像的高、宽 以及通道数
  18. rows, cols, channel = image.shape
  19. #函数参数:旋转中心 旋转度数 scale
  20. M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)
  21. #函数参数:原始图像 旋转参数 元素图像宽高
  22. img4 = cv2.warpAffine(image, M, (cols, rows))
  23. #图像翻转
  24. img5 = cv2.flip(image, 0) #参数=0以X轴为对称轴翻转
  25. img6 = cv2.flip(image, 1) #参数>0以Y轴为对称轴翻转
  26. #图像的仿射
  27. pts1 = np.float32([[50,50],[200,50],[50,200]])
  28. pts2 = np.float32([[10,100],[200,50],[100,250]])
  29. M = cv2.getAffineTransform(pts1,pts2)
  30. img7 = cv2.warpAffine(image, M, (rows,cols))
  31. #图像的透射
  32. pts1 = np.float32([[56,65],[238,52],[28,237],[239,240]])
  33. pts2 = np.float32([[0,0],[200,0],[0,200],[200,200]])
  34. M = cv2.getPerspectiveTransform(pts1,pts2)
  35. img8 = cv2.warpPerspective(image,M,(200,200))
  36. #循环显示图形
  37. titles = [ 'source', 'shift', 'reduction', 'enlarge', 'rotation', 'flipX', 'flipY', 'affine', 'transmission']
  38. images = [image, img1, img2, img3, img4, img5, img6, img7, img8]
  39. for i in range(9):
  40. plt.subplot(3, 3, i+1), plt.imshow(images[i], 'gray')
  41. plt.title(titles[i])
  42. plt.xticks([]),plt.yticks([])
  43. plt.show()

输出: 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/234763
推荐阅读
相关标签
  

闽ICP备14008679号