优秀的编程知识分享平台

网站首页 > 技术文章 正文

OpenCV学习之路-35. 图像的投影变换(边界填充)

nanyue 2024-08-08 18:45:17 技术文章 11 ℃

投影变换(Projective mapping)也称透视变换(Perspective transformation)是建立两平面场之间的对应关系, 将图片投影到一个新的视平面(Viewing plane)。

OpenCV 提供了 cv2.warpPerspective 函数实现投影变换的操作。

函数说明:

cv2.getPerspectiveTransform(src, dst[,solveMethod]) → MP
cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst

函数cv2.getPerspectiveTransform 根据图像中不共线的 4 个点在变换前后的对应位置求得 (3x3) 变换矩阵,cv2.warpPerspective 使用该 (3x3) 变换矩阵即可求出变换后的图像。标量进行加法运算。

参数说明:

  1. src:变换前图像四边形顶点坐标
  2. dst:变换后图像四边形顶点坐标
  3. solveMethod:矩阵分解方法,传递给 cv2.solve 求解变换矩阵 MP
  4. MP:透视变换矩阵,3行3列
  5. dsize: 输出图像的大小,二元元组 (width, height)
  6. dst:变换操作的输出图像,可选项
  7. flags:插值方法,整型(int),可选项
  8. borderMode:边界像素方法,整型(int),可选项,默认值为 cv2.BORDER_REFLECT
  9. borderValue:边界填充模式,可选项,默认值为 0(黑色填充)
  • cv2.BORDER_REPLICATE:复制,复制最边缘像素进行填充(aa | abcdefg | gg),中值滤波采用复制法
  • cv2.BORDER_REFLECT:对称法,以图像边缘为轴进行对称填充(cba| abcdefg | gfe)
  • cv2.BORDER_REFLECTT_101:倒映法,以图像最边缘像素为轴进行对称填充(dcb| abcdefg | fed)
  • cv2.BORDER_WRAP:用另一侧元素来填充这一侧的扩充边界(efg| abcdefg | ab)
  • cv2.BORDER_CONSTANT:以常量像素值(value)填充扩充的边界(VV | abcdefg | VV)

10.返回值:dst,透视变换操作的输出图像,ndarray 多维数组

例程:1.44 图像的投影变换

# 1.44 图像的投影变换
img = cv2.imread("../images/imgC2.jpg") # 读取彩色图像(BGR)
h, w = img.shape[:2] # 图片的高度和宽度
pointSrc = np.float32([[0,0], [w,0], [0,h], [w,h]]) # 原始图像中 4点坐标
pointDst = np.float32([[int(w/3), int(h/3)], [int(w*2/3), int(h/3)], [0,h], [w,h]]) # 变换图像中 4点坐标
MP = cv2.getPerspectiveTransform(pointSrc, pointDst) # 计算投影变换矩阵 M
imgP = cv2.warpPerspective(img, MP, (w,h), flags=cv2.INTER_AREA, borderMode=cv2.BORDER_WRAP)
plt.figure(figsize=(9,6))
plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title("Original"), plt.axis('off')
plt.subplot(122), plt.imshow(cv2.cvtColor(imgP, cv2.COLOR_BGR2RGB)), plt.title("Projective"), plt.axis('off')
plt.show()

最后

【OpenCV学习之路】是针对Python OpenCV学习所打造的一场刷题狂欢party! 对基础知识把握不牢固的话,欢迎来学习嗷~喜欢的话就抓紧收藏起来吧!

如果对学习没有自制力或者没有一起学习交流的动力,欢迎私我“进群”,邀请你来我的学习交流群,我们一起交流学习,报团打卡!

Tags:

最近发表
标签列表