python图形图像处理,python图像转换为矩阵

  python图形图像处理,python图像转换为矩阵

  本文将详细讲解图像的几何变换,包括图像平移、图像缩放和图像旋转。文章中的示例代码解释得很详细,感兴趣的朋友可以向边肖学习。

  

目录
一、图像几何变换二。图片翻译三。图像缩放IV。图像旋转与摘要

  

一.图像几何变换

  图像的几何变换并不改变图像的像素值,而是在图像平面上进行像素变换。适当的几何变换可以最大程度的消除成像角度、透视关系甚至镜头本身带来的几何畸变的负面影响。几何变换经常被用作图像处理应用中的预处理步骤,是图像归一化的核心任务之一[1]。

  几何变换需要两个操作:

  空间变换:包括平移、缩放、旋转和正平行投影等。这是表示输出图像和输入图像之间的像素映射关系所需要的。

  灰度插值算法:根据这种变换关系,输出图像的像素可能映射到输入图像的非整数坐标上[2]。

  在图像变换过程中,几何变换会在原始图像像素和变换后的图像像素之间建立映射关系。通过这种关系,一个像素的坐标位置可以从另一个像素计算出来。通常,将图像坐标映射到输出的过程称为前向映射,而将输出图像映射到输入的过程称为后向映射。向后映射在实践中被广泛使用,因为它可以避免使用向前映射时的不完全映射和重叠映射的问题。

  图6-1显示了一个图像放大的例子。右图中只有四个坐标(0,0)、(0,2)、(2,0)、(2,2)根据映射关系在原图像中找到了对应的像素,其余12个坐标没有有效值[3]。

  对于数字图像,像素的坐标是离散的非负整数,但在变换过程中可能会产生浮点坐标值。这是图像处理中的无效坐标。为了解决这个问题,需要插值算法。常见算法如下:

  最近邻插值双线性插值双三次插值图像变换是基于矩阵运算的,通过矩阵运算可以快速找到对应关系。在本文中,我们将介绍图像的常见几何变换,包括图形平移、图像缩放、图像旋转、图像镜像、图像仿射、图像透视等。

  

二.图像平移

  图像平移就是按照给定的平移量水平或垂直移动图像中的所有像素。假设原像素的位置坐标为(x0,y0),平移量(x,y)后,坐标变为(x1,y1),如图6-2 [3-5]所示。

  用数学公式表示为公式(6-1)。

  矩阵表示如公式(6-2)所示:

  公式中,矩阵称为平移变换矩阵或因子,x和y称为平移量。图像平移首先定义平移矩阵M,然后调用warpAffine()函数实现平移。核心功能如下:

  M=np.float32([[1,0,x],[0,1,y]])

  M代表平移矩阵,其中X代表水平平移,Y代表垂直平移。

  shift=cv2 . warpaffine(src,M,dsize[,dst[,flags[,borderMode[,borderValue]]])

  src表示原始图像。

  m表示转换矩阵。

  DSize表示转换后的输出图像的大小。

  DST是输出图像,大小为dsize,类型与src相同。

  标志表示插值方法的组合和可选值。

  border value表示像素外推。当borderMode=BORDER_TRANSPARENT时,意味着目标图像中的像素不会修改源图像中的“离群点”。

  边界为常数时使用BorderValue,默认情况下为0。

  下面的代码是图像转换的一个简单例子。它定义了图像平移矩阵M,然后调用warpAffine()函数将原始图像垂直向下平移50像素,水平向右平移100像素。

  # -*-编码:utf-8 -*-

  # By:伊斯特蒙特

  导入cv2

  将numpy作为np导入

  #阅读图片

  src=cv2 . im read( scene . png )

  #图像转换矩阵

  M=np.float32([[1,0,100]

  , [0, 1, 50]])

  #获取原始图像列数和行数

  rows, cols = src.shape[:2]

  #图像平移

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

  #显示图像

  cv2.imshow("original", src)

  cv2.imshow("result", result)

  #等待显示

  cv2.waitKey(0)

  cv2.destroyAllWindows()

  输出结果如图6-3所示:

  

  下面一个案例是将图像分别向下、向上、向右、向左平移,再调用matplotlib绘图库依次绘制的过程。

  

# -*- coding:utf-8 -*-

  # By:Eastmount

  import cv2  

  import numpy as np

  import matplotlib.pyplot as plt

  #读取图片

  img = cv2.imread(scenery.png)

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

  #图像平移

  #垂直方向 向下平移100

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

  img1 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

  #垂直方向 向上平移100

  M = np.float32([[1, 0, 0], [0, 1, -100]])

  img2 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

  #水平方向 向右平移100

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

  img3 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

  #水平方向 向左平移100

  M = np.float32([[1, 0, -100], [0, 1, 0]])

  img4 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

  #循环显示图形

  titles = [ Image1, Image2, Image3, Image4]  

  images = [img1, img2, img3, img4]  

  for i in range(4):  

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

     plt.title(titles[i])  

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

  plt.show()

  输出结果如图6-4所示,它从四个方向都进行了平移,并且调用subplot()函数将四个子图绘制在一起。

  

  

  

三.图像缩放

  图像缩放(image scaling)是指对数字图像的大小进行调整的过程。在Python中,图像缩放主要调用resize()函数实现,函数原型如下:

  result = cv2.resize(src, dsize[, result[. fx[, fy[, interpolation]]]])

  – src表示原始图像

  – dsize表示图像缩放的大小

  – result表示图像结果

  – fx表示图像x轴方向缩放大小的倍数

  – fy表示图像y轴方向缩放大小的倍数

  – interpolation表示变换方法。CV_INTER_NN表示最近邻插值;CV_INTER_LINEAR表示双线性插值(缺省使用);

  CV_INTER_AREA表示使用像素关系重采样,当图像缩小时,该方法可以避免波纹出现,当图像放大时,类似于CV_INTER_NN;

  CV_INTER_CUBIC表示立方插值

  常见的图像缩放两种方式如下所示,第一种方式是将原图像设置为(160, 160)像素大小,第二种方式是将原始图像缩小为0.5倍。

  

  • result = cv2.resize(src, (160,160))
  • result = cv2.resize(src, None, fx=0.5, fy=0.5)

  设(x1, y1)是缩放后的坐标,(x0, y0)是缩放前的坐标,sx、sy为缩放因子,则图像缩放的计算公式(6-3)所示:

  

  下面是Python实现图像缩放的代码,它将所读取的风景图像进行缩小。

  

# -*- coding:utf-8 -*-

  # By:Eastmount

  import cv2  

  import numpy as np  

  #读取图片

  src = cv2.imread(scenery.png)

  #图像缩放

  result = cv2.resize(src, (200,100))

  print(result.shape)

  #显示图像

  cv2.imshow("original", src)

  cv2.imshow("result", result)

  #等待显示

  cv2.waitKey(0)

  cv2.destroyAllWindows()

  输出结果如图6-5所示,图像缩小为(100, 200, 3)像素。注意,代码中调用函数 cv2.resize(src, (200,100)) 设置新图像大小dsize的列数为200,行数为100。

  

  下面讲解另一种图像缩放变换的方法,通过原始图像像素乘以缩放系数进行图像变换,代码如下:

  

# -*- coding:utf-8 -*-

  # By:Eastmount

  import cv2  

  import numpy as np  

  #读取图片

  src = cv2.imread(scenery.png)

  rows, cols = src.shape[:2]

  print(rows, cols)

  #图像缩放 dsize(列,行)

  result = cv2.resize(src, (int(cols*0.6), int(rows*1.2)))

  #显示图像

  cv2.imshow("src", src)

  cv2.imshow("result", result)

  cv2.waitKey(0)

  cv2.destroyAllWindows()

  获取图片scenery.png的元素像素值,其rows值为384,cols值为512,接着进行宽度缩小0.6倍、高度放大1.2倍的处理,运行前后对比效果如图6-6所示。

  

  最后讲解调用(fx,fy)参数设置缩放倍数的方法,对原始图像进行放大或缩小操作。下面代码是fx和fy方向缩小至原始图像0.3倍的操作。

  

# -*- coding:utf-8 -*-

  # By:Eastmount

  import cv2  

  import numpy as np  

  #读取图片

  src = cv2.imread(scenery.png)

  rows, cols = src.shape[:2]

  print(rows, cols)

  #图像缩放

  result = cv2.resize(src, None, fx=0.3, fy=0.3)

  #显示图像

  cv2.imshow("src", src)

  cv2.imshow("result", result)

  #等待显示

  cv2.waitKey(0)

  cv2.destroyAllWindows()

  输出的结果如图6-7所示,这是按比例0.3×0.3缩小的。

  

  

  

四.图像旋转

  图像旋转是指图像以某一点为中心旋转一定的角度,形成一幅新的图像的过程。图像旋转变换会有一个旋转中心,这个旋转中心一般为图像的中心,旋转之后图像的大小一般会发生改变。图6-8表示原始图像的坐标(x0, y0)旋转至(x1, y1)的过程。

  

  旋转公式如(6-4)所示,其中(m,n)是旋转中心,a是旋转的角度,(left,top)是旋转后图像的左上角坐标。

  

  图像旋转变换主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转,函数原型如下:

  M = cv2.getRotationMatrix2D(center, angle, scale)

  – center表示旋转中心点,通常设置为(cols/2, rows/2)

  – angle表示旋转角度,正值表示逆时针旋转,坐标原点被定为左上角

  – scale表示比例因子

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

  – src表示原始图像

  – M表示旋转参数,即getRotationMatrix2D()函数定义的结果

  – (cols, rows)表示原始图像的宽度和高度

  实现代码如下所示:

  

# -*- coding:utf-8 -*-

  # By:Eastmount

  import cv2  

  import numpy as np  

  #读取图片

  src = cv2.imread(scenery.png)

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

  rows, cols, channel = src.shape

  #绕图像的中心旋转

  #函数参数:旋转中心 旋转度数 scale

  M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)

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

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

  #显示图像

  cv2.imshow("src", src)

  cv2.imshow("rotated", rotated)

  #等待显示

  cv2.waitKey(0)

  cv2.destroyAllWindows()

  显示效果如图6-9所示,绕图像中心点逆时针旋转30度。

  

  

  

五.总结

  本章主要讲解Python和OpenCV的图像几何变换,详细介绍了图像平移、图像缩放和图像旋转,这些知识点也是我们PC端或手机端图像处理应用常见的算法,读者可以尝试结合这些应用完成一套图像处理软件。

  以上就是Python图像处理之几何变换的详细内容,更多关于Python图像几何变换的资料请关注盛行IT软件开发工作室其它相关文章!

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

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