本文介绍几种常见的图像几何变换方法。

1. 图像缩放

图像缩放就是将源图像中的像素点经过算法映射到目标图像的像素点的过程,即找出目标图像中的像素点Pd(Xd,Yd)对应的源图像的像素点Ps(Xs,Ys),然后将源图像像素点填充到对应目标图像的像素点,最终形成目标图像。常见的图像缩放算法有最邻近点插值法、双线性插值法和BiCubic卷积插值法等。

在OpenCV中提供函数cv2.resize()实现对图像的缩放,该函数原型如下:

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

参数说明:
dst:输出的目标图像,其类型与src相同,大小为dsize(当该值非零时),或者可以通过src.size()、fx、fy计算得到;
src:需要进行缩放的原始图像;
dsize:输出图像的大小;
x:水平方向的缩放比例;
y:垂直方向的缩放比例;
interpolation:插值方式。

插值是指图像在进行几何处理时,给无法直接通过映射得到的值的像素点赋值。比如,将原始图像放大为原来的2倍,必然会多出一些无法被直接映射值的像素点,对于这些像素点,插值方式决定了如何确定它们的值。当缩小图像时,使用区域插值方式(INTER_AREA)能够得到最好的效果;当放大图像时,使用三次样条插值(INTER_CUBIC)方式和双线性插值(INTER_LINEAR)方式都能够取得较好的效果。三次样条插值方式速度较慢,双线性插值方式速度相对较快且效果并不逊色。

测试代码如下:

img = cv2.imread("lenna.jpg")
height, width = img.shape[:2]  # 获取图像的高度和宽度
cv2.imshow('src', img)# 缩放到原来的二分之一
img_test1 = cv2.resize(img, (int(height / 2), int(width / 2)))
cv2.imshow('resize1', img_test1)# 最近邻插值法缩放,缩放到原来的四分之一
img_test2 = cv2.resize(img, (0, 0), fx=0.25, fy=0.25, interpolation=cv2.INTER_NEAREST)
cv2.imshow('resize2', img_test2)
cv2.waitKey()
cv2.destroyAllWindows()

效果如下:

2 图像旋转

图像旋转是指将图像绕某个中心点旋转一定角度后,得到一幅新的图像。

Python中imutils工具包提供了如下函数实现图像旋转:
imutils.rotate:实现了在旋转完成图分辨率不调整的情况下,对原图像内容旋转,可能局部丢失,缺失部分用黑色填充。
imutils.rotate_bound:保持原图完整,旋转完成图分辨率会改变。

测试代码如下:

 import imutils
img = cv2.imread("lenna.jpg")
cv2.imshow('src', img)# 旋转45度,可能局部丢失,缺失部分用黑色填充rot1 = imutils.rotate(img, angle=45)
cv2.imshow("Rotated1", rot1)# 旋转45度,保持原图完整,旋转完成图分辨率会改变rot2 = imutils.rotate_bound(img, angle=45)
cv2.imshow("Rotated2", rot2)
cv2.waitKey()
cv2.destroyAllWindows()

效果如下:

3 图像翻转

翻转也称镜像,是指将图像沿轴线进行轴对称变换。水平镜像是将图像沿垂直中轴线进行左右翻转,垂直镜像是将图像沿水平中轴线进行上下翻转,水平垂直镜像是水平镜像和垂直镜像的叠加。

OpenCV提供了cv2.flip函数,可以将图像沿水平方向、垂直方向、或水平/垂直方向同时进行翻转。其函数原型如下:

cv2.flip(src, flipCode[, dst]) -> dst

参数说明:
scr:变换操作的输入图像;
flipCode:控制参数,整型(int),flipCode>0 水平翻转,flipCode=0 垂直翻转,flipCode<0 水平和垂直翻转;
dst:变换操作的输出图像,可选项。

测试代码如下:

img = cv2.imread("lenna.jpg")  # 读取彩色图像(BGR)imgFlip1 = cv2.flip(img, 0)  # 垂直翻转
imgFlip2 = cv2.flip(img, 1)  # 水平翻转
imgFlip3 = cv2.flip(img, -1)  # 水平和垂直翻转plt.subplot(221), plt.axis('off'), plt.title("Original")
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 原始图像
plt.subplot(222), plt.axis('off'), plt.title("Flipped Horizontally")
plt.imshow(cv2.cvtColor(imgFlip2, cv2.COLOR_BGR2RGB))  # 水平翻转
plt.subplot(223), plt.axis('off'), plt.title("Flipped Vertically")
plt.imshow(cv2.cvtColor(imgFlip1, cv2.COLOR_BGR2RGB))  # 垂直翻转
plt.subplot(224), plt.axis('off'), plt.title("Flipped Horizontally & Vertically")
plt.imshow(cv2.cvtColor(imgFlip3, cv2.COLOR_BGR2RGB))  # 水平垂直翻转
plt.show()

效果如下:

4 图像平移

图像的平移就是将图像上的像素点整体移动。图像平移首先定义平移矩阵M,再调用warpAffine()函数实现平移,函数原型如下:

M = np.float32([[1, 0, x], [0, 1, y]])
shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

测试代码如下:

img = cv2.imread('lenna.jpg')
image = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)# 图像下、上、右、左平移M = np.float32([[1, 0, 0], [0, 1, 100]])
img1 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))M = np.float32([[1, 0, 0], [0, 1, -100]])
img2 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))M = np.float32([[1, 0, 100], [0, 1, 0]])
img3 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))M = np.float32([[1, 0, -100], [0, 1, 0]])
img4 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))# 显示图形titles = [ 'Image-down', 'Image-up', 'Image-right', 'Image-left']
images = [img1, img2, img3, img4]
for i in range(4):  plt.subplot(2,2,i+1), plt.imshow(images[i]), plt.title(titles[i])  plt.xticks([]),plt.yticks([])
plt.show()

效果如下:

图像缩放、旋转、翻转、平移相关推荐

  1. c语言中实现自动平移,c语言实现图像的旋转与平移

    y y y (4) ty≥height,图象完全移出了屏幕,不用做任何处理. 这种做法利用了位图存储的连续性,即同一行的象素在内存中是相邻的.利用 memcpy函数, 从(x ,y )-x )处,拷 ...

  2. python图像处理第七课--图像缩放、翻转、旋转、平移--小白的成长历程

    #目的为记录在自己运行时存在的问题及解决方法,本文基于CSDN社区的Eastmount大佬的课程,通过学习,其中也增加了自己的考量和问题的解决. 图像缩放 图像缩放由 resize() 函数实现,如下 ...

  3. c语言实现图像的平移,c语言实现图像的旋转与平移

    实验二图象的几何变换参考资料 1 平移 平移(translation)变换是几何变换中最简单的一种.初始坐标为(x0,y0)的点经过平移(tx,ty)(以向右,向下为正方向)后,坐标变为(x1,y1) ...

  4. 图像的仿射变换原理及c++实现(旋转,平移,缩放,偏移,组合变换)

    github地址:https://github.com/2209520576/Image-Processing-Algorithm 一.写在前面 几何空间变换是图像处理中的最基础的算法,主要包括图像的 ...

  5. opencv warpAffine()函数详解 -- 图像旋转与平移

    简述 仿射变换是二维坐标间的线性变换,故而变换后的图像仍然具有原图的一些性质,包括"平直性"以及"平行性",常用于图像翻转(Flip).旋转(Rotations ...

  6. 应用OpenCV进行图像旋转和平移

    简 介: 本文中,你了解了了如何通过OpenCV完成对于图像的旋转和平移.我们首先通过 getRotationMatrix2D() 获取2D旋转矩阵,然后完成了对于图像的旋转.具体是通过warpAff ...

  7. MFC+OpenGL三维绘图(一)——简单绘图平台的搭建与实现图像的旋转、缩放

    声明:本文章为小白本人第一次创作,文章可能会有诸多不足,希望大家批评指正! VS2013下载:https://pan.baidu.com/s/1Y7TuZlLaGsbj2KCZV_uckw OpenG ...

  8. 【OpenCV3】图像旋转与平移——cv::warpAffine()详解

    图像旋转和平移是图像处理中常用的一种操作,opencv2和opencv3中对图像的旋转和平移都是通过仿射变换函数cv::warpAffine()来实现的. 1.图像的旋转 图像的旋转具体实现分为两步: ...

  9. opencv学习笔记之图像尺寸、翻转与仿射变换

    文章目录 前言 一.图像尺寸变换 二.图像翻转变换 三.图像仿射变换 getRotationMatrix2D()函数用于计算旋转矩阵 getAffineTransform()函数 warpAffine ...

  10. opencv 中affine函数实现旋转和平移

    图像旋转和平移是图像处理中常用的一种操作,opencv2和opencv3中对图像的旋转和平移都是通过仿射变换函数cv::warpAffine()来实现的. 1.图像的旋转 图像的旋转具体实现分为两步: ...

最新文章

  1. SpringCloud Feign声明式服务调用
  2. 雷军、张小龙:高手的努力深入而轻松,普通人的努力肤浅而痛苦!
  3. 4'.deploy.prototxt
  4. vue音乐笔记_Vue音乐项目笔记(二)
  5. C/C++中单井号与双井号的使用
  6. 图像处理--图像上采样和下采样
  7. Codeforces- Educational Codeforces Round 69
  8. JDK 18 / Java 18 GA 发布
  9. Lucene知识小总结8:索引查询
  10. 喜马拉雅音频下载工具 - xmlyfetcher
  11. 全国路网数据SHP、全国矢量数据 行政区划边界(省市区县乡镇)、行政地名
  12. 通道抠图蒙版置入背景(抠图换背景)
  13. python 求向量间内积 和外积
  14. Libcurl最初的实现tfp上传和下载功能
  15. 正则表达式(regex)入门
  16. 10G整数中寻找中位数
  17. C++Primer 习题 第7章
  18. 语音交友app开发中的用户积分系统
  19. 使用开源激光SLAM方案LIO-SAM运行KITTI数据集,如有用,请评论雷锋
  20. RT-Thread 嵌入式人工智能教学在线研讨会,就在本周六!

热门文章

  1. Kaggle天池比赛经验
  2. 禁止小程序输入Emoji表情符
  3. pubmedy安装不聊了_Pubmedy:显示影响因子+引用数、Sci-hub全文下载的浏览器扩展...
  4. 于皓月繁星下翩翩起舞
  5. div用css显示隐藏的效果
  6. 双端队列BFS:拖拉机
  7. lintcode---电话号码的字母组合
  8. xposed android debug,Android 手机开启全局调试xposed插件
  9. 数字游戏 -- 寻找缺失的数字
  10. 在Excel中如何把每三行数据合并为一行?