python图像处理实战 豆瓣,python的图像处理

  python图像处理实战 豆瓣,python的图像处理

  本文主要讲解图像仿射变换和图像透视变换,并通过Python调用OpenCV函数。

  本文由eastmount分享自华为云社区《[Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正》。

  一、图像仿射变换图像仿射变换,也称图像仿射映射,在几何学中是指通过线性变换后的平移,将一个向量空间变换到另一个向量空间。通常图像旋转加图像拉伸就是图像仿射变换。仿射变换需要一个M矩阵,但是由于仿射变换的复杂性,很难找到这个M矩阵。

  OpenCV提供了函数——cv2。getaffinetransform(pos1,pos2)根据变换前后三点的对应关系自动求解M,其中pos 1和Pos2表示变换前后位置的对应关系,输出结果为仿射矩阵M .然后利用函数cv2.warpAffine()实现图像仿射变换。图5-14显示了仿射变换前后的效果。

  图像仿射变换的函数原型如下:

  M=cv2.getAffineTransform(pos1,pos2)

  1表示变换前的位置1,pos2表示变换后的位置cv2。Warpaffin (src,m,(列,行))

  表示src原始图像的m表示仿射变换矩阵(rows,cols)表示变换后图像的大小,rows表示行数,cols表示列数,实现代码如下:

  #编码:utf-8

  导入cv2

  将numpy作为np导入

  将matplotlib.pyplot作为plt导入

  #阅读图片

  src=cv2.imread(test.bmp )

  #获取图像大小

  rows,cols=src.shape[:2]

  #设置图像仿射变换矩阵

  pos1=np.float32([[50,50],[200,50],[50,200]])

  pos2=np.float32([[10,100]、[200,50]、[100,250]])

  M=cv2.getAffineTransform(pos1,pos2)

  #图像仿射变换

  result=cv2.warpAffine(src,M,(cols,rows))

  #显示图像

  cv2.imshow(原始,src)

  cv2.imshow(result ,结果)

  #等待显示

  cv2.waitKey(0)

  2.cv2.destroyAllWindows()的输出渲染如下:

  二。图像透视变换。透视变换的本质是将图像投射到一个新的视觉平面上。同样,OpenCV通过函数cv2.getperspective变换(pos1,pos2)构造一个矩阵M,其中pos 1和pos 2分别代表变换前后四个点的对应位置。获得m后,通过函数cv2.warpperspective (src,m,(cols,rows))执行透视变换。

  图像透视变换的功能原型如下:

  m=cv2 . getperspective transform(pos 1,pos2)

  1表示透视变换前四个点的对应位置,pos1表示透视变换后四个点的对应位置CV2。扭曲透视(src,m,(列,行))。

  m表示原始图像src表示透视变换矩阵(rows,cols ),表示变换后的图像尺寸,rows表示行数,cols表示列数。代码如下:

  #编码:utf-8

  导入cv2

  将numpy作为np导入

  将matplotlib.pyplot作为plt导入

  #阅读图片

  src=cv2.imread(test01.jpg )

  #获取图像大小

  rows,cols=src.shape[:2]

  #设置图像透视变换矩阵

  pos1=np.float32([[114,82]、[287,156]、[8,322]、[216,333]])

  pos2=np.float32([[0,0],[188,0],[0,262],[188,262])

  m=cv2 . getperspective transform(pos 1,pos2)

  #图像透视变换

  result=cv2.warpPerspective(src,M,(190,272))

  #显示图像

  cv2.imshow(原始,src)

  cv2.imshow(result ,结果)

  #等待显示

  cv2.waitKey(0)

  2.cv2.destroyAllWindows()的输出结果如下图所示:

  三。基于图像透视变换的图像校正。参考下面t6_17大神的文章,通过图像透视变换实现图像校正功能。

  假设有一张A4纸图像,现在需要通过调用图像透视变换来校正图像。

  代码如下:

  #编码:utf-8

  导入cv2

  将numpy作为np导入

  将matplotlib.pyplot作为plt导入

  #阅读图片

  src=cv2.imread(test01.jpg )

  #获取图像大小

  rows,cols=src.shape[:2]

  #高斯模糊源图像

  img=cv2。高斯布朗(src,(3,3),0)

  #执行灰度处理。

  gray=cv2.cvtColor(img,cv2。COLOR_BGR2GRAY)

  #边缘检测(检测图像的边缘信息)

  边缘=cv2。Canny(灰色,50,250,apertureSize=3)

  cv2.imwrite(canny.jpg ,edges)

  #通过霍夫变换得到A4纸边缘

  lines=cv2。HoughLinesP(edges,1,np.pi/180,50,minLineLength=90,maxLineGap=10)

  #下面输出的四个点分别是四个顶点。

  对于行[0]中的x1、y1、x2、y2:

  打印(x1,y1),(x2,y2)

  空军中尉

  打印(x1,y1),(x2,y2)

  #绘制边缘

  对于行[0]中的x1、y1、x2、y2:

  cv2.line(灰色,(x1,y1),(x2,y2),(0,0,255),1)

  #根据四个顶点设置图像透视变换矩阵

  pos1=np.float32([[114,82]、[287,156]、[8,322]、[216,333]])

  pos2=np.float32([[0,0]、[188,0]、[0,262]、[188,262])

  m=cv2。获取透视变换(位置1,位置2)

  #图像透视变换

  result=cv2.warpPerspective(src,M,(190,272))

  #显示图像

  cv2.imshow(原始,src)

  cv2.imshow(result ,结果)

  #等待显示

  cv2.waitKey(0)

  cv2.destroyAllWindows()运行结果如下图所示:

  四。图像几何变换总结最后补充图像几何代码所有变换,希望读者能体会下相关的代码,并动手实践下。输出结果以女神为例:

  完整代码如下:

  #编码:utf-8

  导入cv2

  将数组作为铭牌导入

  将matplotlib.pyplot作为血小板计数导入

  #读取图片

  img=cv2.imread(test3.jpg )

  image=cv2.cvtColor(img,cv2 .COLOR_BGR2RGB)

  #图像平移矩阵

  M=np.float32([[1,0,80],[0,1,30]])

  rows,cols=image.shape[:2]

  img1=cv2.warpAffine(image,M,(cols,rows))

  #图像缩小

  img2=cv2.resize(image,(200,100))

  #图像放大

  img3=cv2.resize(image,None,fx=1.1,fy=1.1)

  #绕图像的中心旋转

  #源图像的高、宽以及通道数

  row,cols,channel=image.shape

  #函数参数:旋转中心旋转度数规模

  m=cv2。getrotationmatrix 2d((cols/2,rows/2),30,1)

  #函数参数:原始图像旋转参数元素图像宽高

  img4=cv2.warpAffine(image,M,(cols,rows))

  #图像翻转

  img5=cv2.flip(image,0) #参数=0以X轴为对称轴翻转

  img6=cv2.flip(image,1) #参数0以Y轴为对称轴翻转

  #图像的仿射

  pts1=np.float32([[50,50],[200,50],[50,200]])

  pts2=np.float32([[10,100],[200,50],[100,250]])

  M=cv2.getAffineTransform(pts1,pts2)

  img7=cv2.warpAffine(image,M,(rows,cols))

  #图像的透射

  pts1=np.float32([[56,65]、[238,52]、[28,237]、[239,240])

  pts2=np.float32([[0,0]、[200,0]、[0,200]、[200,200])

  m=cv2。获取透视变换(pt S1,pts2)

  img8=cv2.warpPerspective(image,M,(200,200))

  #循环显示图形

  titles=[源,移位,缩小,放大,旋转, flipX , flipY ,仿射,传输]

  images=[image,img1,img2,img3,img4,img5,img6,img7,img8]

  对于xrange(9)中的我:

  plt.subplot(3,3,i 1),plt.imshow(images[i], gray )

  工厂名称(标题[我])

  plt.xticks([]),plt.yticks([])

  plt.show()

  点击关注,第一时间了解华为云新鲜技术~

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: