一.图像加法运算

1.Numpy库加法
其运算方法是:目标图像 = 图像1 + 图像2,运算结果进行取模运算。

当像素值<=255时,结果为“图像1+图像2”,例如:120+48=168
当像素值>255时,结果为对255取模的结果,例如:(255+64)%255=64

2.OpenCV加法运算
另一种方法是直接调用OpenCV库实现图像加法运算,方法如下:
目标图像 = cv2.add(图像1, 图像2)
此时结果是饱和运算,即:

当像素值<=255时,结果为“图像1+图像2”,例如:120+48=168
当像素值>255时,结果为255,例如:(255+64) = 255
#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取图片
img = cv2.imread('picture.bmp')
test = img#方法一:Numpy加法运算
result1 = img + test#方法二:OpenCV加法运算
result2 = cv2.add(img, test)#显示图像
cv2.imshow("original", img)
cv2.imshow("result1", result1)
cv2.imshow("result2", result2)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下图所示,其中result1为第一种方法,result2为第二种方法,白色点255更多。

注意:参与运算的图像大小和类型必须一致。下面是对彩色图像进行加法运算的结果。二.图像融合

图像融合通常是指将2张或2张以上的图像信息融合到1张图像上,融合的图像含有更多的信息,能够更方便人们观察或计算机处理。如下图所示,将两张不清晰的图像融合得到更清晰的图。
图像融合是在图像加法的基础上增加了系数和亮度调节量。

图像加法:目标图像 = 图像1 + 图像2
图像融合:目标图像 = 图像1 * 系数1 + 图像2 * 系数2 + 亮度调节量
主要调用的函数是addWeighted,方法如下:
dst = cv2.addWeighter(scr1, alpha, src2, beta, gamma)
dst = src1 * alpha + src2 * beta + gamma
其中参数gamma不能省略。

代码如下:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取图片
src1 = cv2.imread('test22.jpg')
src2 = cv2.imread('picture.bmp')#图像融合
result = cv2.addWeighted(src1, 1, src2, 1, 0)#显示图像
cv2.imshow("src1", src1)
cv2.imshow("src2", src2)
cv2.imshow("result", result)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

需要注意的是,两张融合的图像像素大小需要一致,如下图所示,将两张RGB且像素410*410的图像融合。
设置不同的比例的融合如下所示:
result = cv2.addWeighted(src1, 0.6, src2, 0.8, 10)
三.图像类型转换

图像类型转换是指将一种类型转换为另一种类型,比如彩色图像转换为灰度图像、BGR图像转换为RGB图像。OPenCV提供了200多种不同类型之间的转换,其中最常用的包括3类,如下:

cv2.COLOR_BGR2GRAY
cv2.COLOR_BGR2RGB
cv2.COLOR_GRAY2BGR

代码如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取图片
src = cv2.imread('01.bmp')#图像类型转换
result = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下图所示:
如果使用通道转化,则结果如下图所示:
result = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)
四.图像缩放

图像缩放主要调用resize()函数实现,具体如下:
result = cv2.resize(src, dsize[, result[. fx[, fy[, interpolation]]]])
其中src表示原始图像,dsize表示缩放大小,fx和fy也可以表示缩放大小倍数,他们两个(dsize或fx\fy)设置一个即可实现图像缩放。例如:

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

图像缩放:设(x0, y0)是缩放后的坐标,(x, y)是缩放前的坐标,sx、sy为缩放因子,则公式如下:
代码示例如下所示:

#encoding:utf-8
import cv2
import numpy as np  #读取图片
src = cv2.imread('test.jpg')#图像缩放
result = cv2.resize(src, (200,100))
print result.shape#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下图所示,图像缩小为(200,100)像素。
需要注意的是,代码中 cv2.resize(src, (200,100)) 设置的dsize是列数为200,行数为100。
同样,可以获取原始图像像素再乘以缩放系数进行图像变换,代码如下所示。

#encoding:utf-8
import cv2
import numpy as np  #读取图片
src = cv2.imread('test.jpg')
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()

输出结果如下图所示:最后讲解(fx,fy)缩放倍数的方法对图像进行放大或缩小。

#encoding:utf-8
import cv2
import numpy as np  #读取图片
src = cv2.imread('test.jpg')
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()

最后输出的结果如下图所示,这是按例比0.3*0.3缩小的。
五.图像旋转

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

M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)
参数分别为:旋转中心、旋转度数、scale
rotated = cv2.warpAffine(src, M, (cols, rows))
参数分别为:原始图像、旋转参数、原始图像宽高

图像旋转:设(x0, y0)是旋转后的坐标,(x, y)是旋转前的坐标,(m,n)是旋转中心,a是旋转的角度,(left,top)是旋转后图像的左上角坐标,则公式如下:
代码如下所示:

#encoding:utf-8
import cv2
import numpy as np  #读取图片
src = cv2.imread('test.jpg')#原图的高、宽 以及通道数
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()

输出结果如下图所示:
如果设置-90度,则核心代码和图像如下所示。
M = cv2.getRotationMatrix2D((cols/2, rows/2), -90, 1)
rotated = cv2.warpAffine(src, M, (cols, rows))
六.图像翻转

图像翻转在OpenCV中调用函数flip()实现,原型如下:
dst = cv2.flip(src, flipCode)
其中src表示原始图像,flipCode表示翻转方向,如果flipCode为0,则以X轴为对称轴翻转,如果fliipCode>0则以Y轴为对称轴翻转,如果flipCode<0则在X轴、Y轴方向同时翻转。

代码如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取图片
img = cv2.imread('test.jpg')
src = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#图像翻转
#0以X轴为对称轴翻转 >0以Y轴为对称轴翻转 <0X轴Y轴翻转
img1 = cv2.flip(src, 0)
img2 = cv2.flip(src, 1)
img3 = cv2.flip(src, -1)#显示图形
titles = ['Source', 'Image1', 'Image2', 'Image3']
images = [src, img1, img2, img3]
for i in xrange(4):  plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray')  plt.title(titles[i])  plt.xticks([]),plt.yticks([])
plt.show()  

输出结果如下图所示:
七.图像平移
图像平移:设(x0, y0)是缩放后的坐标,(x, y)是缩放前的坐标,dx、dy为偏移量,则公式如下:
图像平移首先定义平移矩阵M,再调用warpAffine()函数实现平移,核心函数如下:
M = np.float32([[1, 0, x], [0, 1, y]])
shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

完整代码如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取图片
img = cv2.imread('test.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 = [ 'Image1', 'Image2', 'Image3', 'Image4']
images = [img1, img2, img3, img4]
for i in xrange(4):  plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray')  plt.title(titles[i])  plt.xticks([]),plt.yticks([])
plt.show()  

输出结果如下图所示:

Python图像处理](2)---图像融合、加法运算及图像类型转换、图像缩放、图像旋转、图像翻转与图像平移相关推荐

  1. Python图像处理丨图像缩放、旋转、翻转与图像平移

    摘要:本篇文章主要讲解Python调用OpenCV实现图像位移操作.旋转和翻转效果,包括四部分知识:图像缩放.图像旋转.图像翻转.图像平移. 本文分享自华为云社区<[Python图像处理] 六. ...

  2. 【OpenCV 例程200篇】13. 图像的加法运算(cv2.add)

    [OpenCV 例程200篇]13. 图像的加法运算(cv2.add) 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 ...

  3. 【python图像处理】图像的缩放、旋转与翻转

    图像的几何变换,如缩放.旋转和翻转等,在图像处理中扮演着重要的角色,python中的Image类分别提供了这些操作的接口函数,下面进行逐一介绍. 1.图像的缩放 图像的缩放使用resize()成员函数 ...

  4. opencv 图像平移、缩放、旋转、翻转 图像仿射变换

    图像几何变换 图像几何变换从原理上看主要包括两种:基于2x3矩阵的仿射变换(平移.缩放.旋转.翻转).基于3x3矩阵的透视变换. 图像平移 opencv实现图像平移 实现图像平移,我们需要定义下面这样 ...

  5. 深度学习数据增强方法,利用仿射变换实现图像进行各种操作如平移、缩放、旋转、翻转

    导读 在深度学习的数据增强中,我们经常需要对图像进行各种增强操作如平移.缩放.旋转.翻转等,这些其实都是图像的仿射变换.通过本篇文章,你能够知道它们的实现原理以及如何应用它们.本文讲述如何通过仿射变换 ...

  6. OpenCV-Python图像的加法运算cv2.add函数详解

    ☞ ░ 前往老猿Python博文目录 ░ 一.加法概述 图像加法主要有两种用途,一种是可用于减少甚至消除图像采集中混入的噪声,由于图像各点的采集噪声是互不相关的,且噪声具有零均值的统计特性,因此可以对 ...

  7. 代码 马佳义_【图像融合学习笔记002】图像融合论文及代码网址整理总结(2)——红外与可见光图像融合...

    写在前面的话: 本篇博文主要整理汇总一下现有的红外与可见光图像融合算法(文章和代码).适当地,也会整理出作者的学术主页.整理这些的初衷,是为了方便自己,顺便也给同领域的研究者在找代码等方面提供些许便利 ...

  8. 图像缩放、旋转、翻转、平移

    本文介绍几种常见的图像几何变换方法. 1. 图像缩放 图像缩放就是将源图像中的像素点经过算法映射到目标图像的像素点的过程,即找出目标图像中的像素点Pd(Xd,Yd)对应的源图像的像素点Ps(Xs,Ys ...

  9. python ^ 操作在两整数加法运算中的妙用

    问题描述:如何不使用+实现两个整数的加法(包括负数)? 解释:这就是要让我们手动实现计算机中对两整数加法的实现呀 那计算机怎么实现加法呢?当然是用二进制呀 二进制加法的情况也就几种,总结下就是使用^实 ...

  10. 图像增广 || 通过仿射变换实现图像的平移、缩放、旋转、翻转、错切,及MATLAB实现与分析

    1.仿射变换理论 仿射变换(Affine Transformation或 Affine Map)是一种二维坐标(x,y)到二维坐标(u,v)之间的线性变换,它保持了二维图形的"平直性&quo ...

最新文章

  1. C基础知识小总结(十)
  2. 有哪些可以免登录的视频会议软件/服务?
  3. (转)搜索Maven仓库 获取 groupid artifactId
  4. 03-CA/TA编程:aes_auth demo
  5. 【MFC】创建第一个应用程序
  6. 移动端 长按事件_Flutter事件监听
  7. 如何调整标题字体大小_软网推荐:找回调整Windows 10字号功能
  8. 无需深厚技术背景,也可以做好系统和应用维护管理
  9. Network-Monitor项目中观察者模式解析
  10. AR:Unity与iOS交互(入门篇)
  11. java判断safari_js代码判断浏览器种类IE、FF、Opera、Safari、chrome及版本
  12. union all关联两个不相关的表,按时间排序
  13. java中Collection和Collections的区别和联系
  14. 计算机网络连接图标 红叉,Win10网络图标显示红叉叉 检测不到网卡驱动解决方案...
  15. 诊所 金卫系统 青岛_金卫体检信息管理系统
  16. 穿越时空—智慧城市大数据可视化分析决策系统
  17. jersey 过滤,Jersey Jackson数据实体在集合上过滤JsonMappingException
  18. Libra最后的命运
  19. Modbus 的RTU、ASCII、TCP傻傻搞不清楚?一文最全解读
  20. 制作U盘启动来安装Linux系统的具体方法(图文)

热门文章

  1. 【iOS-Cocos2d游戏开发之二十一 】自定义精灵类并为你的精灵设置***帧以及动画创建!【二】...
  2. linux下 iptables 的配置
  3. 推荐几个学习JS的站点
  4. string.Empty与,null的区别
  5. Luogu1712 [NOI2016] 区间
  6. [图论] 树剖LCA
  7. uniapp某个页面高度占满写法
  8. el-select的写法
  9. linux精简版远程登录,Linux下定制SSH来简化远程访问的方法
  10. 计算机工作原理_学堂第九课|计算机内部的工作原理