1、图像加法运算(用numpy)

对像素值取模(大于255的减去255用余值作为像素)
通过将数组的数值类型定义为 dtype= np.uint8,可以保证数组值的范围在[0,255] 之间

import numpy as np
img1 = np.random.randint(0, 256, size=[3, 3], dtype=np.uint8)#选取0,256的随机数,组成3*3的矩阵,指定的数据类型dtype保证数值范围,自动取模
img2 = np.random.randint(0, 256, size=[3, 3], dtype=np.uint8)
print("img1=\n", img1)#打印随机矩阵
print("img2=\n", img2)
print("img1+img2=\n", img1+img2)#两个矩阵相加

2、图像加法运算(用opencv)

与1的区别:使用函数 cv2.add()对像素值a 和像素值b 进行求和运算时,会得到像素值对应图像的饱和值(最大值255)。

import numpy as np
import cv2
img1 = np.random.randint(0, 256, size=[3, 3], dtype=np.uint8)
img2 = np.random.randint(0, 256, size=[3, 3], dtype=np.uint8)
print("img1=\n", img1)
print("img2=\n", img2)
img3=cv2.add(img1, img2)
print("cv2.add(img1,img2)=\n", img3)

3、图像的加法运算——图像实例

用numpy和opencv比较图像的现象
numpy取模,opencv部分像素值达到饱和变亮

import cv2
a = cv2.imread("lena.bmp", 0)
b = a
result1 = a+b
result2 = cv2.add(a, b)
cv2.imshow("original", a)#最原始的图像
cv2.imshow("result1", result1)#两个相同图象的像素值相加
cv2.imshow("result2", result2)#add函数求和,得到对应图像的饱和值
cv2.waitKey()
cv2.destroyAllWindows()

4、图像的加权和(融合)

函数 cv2.addWeighted,用来实现图像的加权和(混合、融合)
np.ones()函数返回给定形状和数据类型的新数组,其中元素的值设置为1

import cv2
import numpy as np
img1 = np.ones((3, 4), dtype=np.uint8)*100#生成一个 3×4 大小的、元素数值都是 100 的二维数组,对应一个灰度图像 imgl
img2 = np.ones((3, 4), dtype=np.uint8)*10#生成一个 3×4 大小的、元素数值都是 10 的二维数组,对应一个灰度图像 img2
gamma = 3 #将调节亮度参数 gamma 的值设置为3
img3 = cv2.addWeighted(img1, 0.6, img2, 5, gamma) #计算“img1×0.6+img2×5+3”的混合值
print(img3)

5、两幅图像按权重融合

使用函数cv2.addWeighted() 对两幅图像进行加权混合,观察处理结果

import cv2
a=cv2.imread("boat.bmp")
b=cv2.imread("lena.bmp")
result=cv2.addWeighted(a, 0.6, b, 0.4, 0)
cv2.imshow("boat", a)
cv2.imshow("lena", b)
cv2.imshow("result", result)#图像boat和图像lean加权混合结果图像
cv2.waitKey()
cv2.destroyAllWindows()

3、扣取ROI图像混合在另外一幅图中

使用函数 cv2.addWeighted() 将一幅图像的ROI 混合在另外一幅图像内

import cv2
lena = cv2.imread("lena512.bmp", cv2.IMREAD_UNCHANGED)
dollar = cv2.imread("dollar.bmp", cv2.IMREAD_UNCHANGED)
cv2.imshow("lena", lena)
cv2.imshow("dollar", dollar)
face1 = lena[220:400, 250:350]
face2 = dollar[160:340, 200:300]
add = cv2.addWeighted(face1, 0.6, face2, 0.4, 0)#实现图像加权和
dollar[160:340, 200:300] = add#lena 的面部与图像 dollar 的面部加权混合得到的图像
cv2.imshow("result", dollar)
cv2.waitKey()
cv2.destroyAllWindows()

7、按位逻辑运算

cv2.bitwise_and():与操作
和0位与则为0,和255位与则为数值本身

mport cv2
import numpy as np
a = np.random.randint(0, 255, (5, 5), dtype=np.uint8)
b = np.zeros((5, 5), dtype=np.uint8)
b[0:3, 0:3] = 255
b[4, 4] = 255
c = cv2.bitwise_and(a, b)#按位与操作有如下特点:# 将任何数值N 与数值0 进行按位与操作,都会得到数值0#将任何数值N(这里仅考虑8 位值)与数值 255(8 位二进制数是1111 1111)进行按位与操作,都会得到数值N本身
print("a=\n", a)
print("b=\n", b)
print("c=\n", c)

8、图像按位与运算

import cv2
import numpy as np
a = cv2.imread("lena.bmp", 0)
b = np.zeros(a.shape, dtype=np.uint8)
b[100:400, 200:400] = 255
b[100:500, 100:200] = 255
c = cv2.bitwise_and(a, b) #按位逻辑运算
cv2.imshow("a", a)
cv2.imshow("b", b)
cv2.imshow("c", c)
cv2.waitKey()
cv2.destroyAllWindows()

9、图像按位与运算

import cv2
import numpy as np
a = cv2.imread("lena.bmp", 1)
b = np.zeros(a.shape, dtype=np.uint8)
b[100:400, 200:400] = 255
b[100:500, 100:200] = 255
c = cv2.bitwise_and(a, b)#按位逻辑运算
print("a.shape=", a.shape)
print("b.shape=", b.shape)
cv2.imshow("a", a)
cv2.imshow("b", b)
cv2.imshow("c", c)
cv2.waitKey()
cv2.destroyAllWindows()

10、图像的叠加

掩模:用选定的图像、图形或物体,对待处理的图像(局部或全部)进行遮挡来控制图像处理的区域或处理过程。由于覆盖的特定图像或物体称为掩模或模板。

import cv2
import numpy as np
img1=np.ones((4,4),dtype=np.uint8)*3
img2=np.ones((4,4),dtype=np.uint8)*5
mask=np.zeros((4,4),dtype=np.uint8)#掩模
mask[2:4,2:4]=1
img3=np.ones((4,4),dtype=np.uint8)*66
print("img1=\n",img1)
print("img2=\n",img2)
print("mask=\n",mask)
print("初始值img3=\n",img3)
img3=cv2.add(img1,img2,mask=mask)#下面将仅仅取含有mask区域部分
print("求和后img3=\n",img3)

11、图像的叠加——图像实例

mask用关键词传递参数

import cv2
import numpy  as np
a=cv2.imread("lena.bmp",1)
w,h,c=a.shape
mask=np.zeros((w,h),dtype=np.uint8)
mask[100:400,200:400]=255
mask[100:500,100:200]=255
c=cv2.bitwise_and(a,a,mask=mask)#背景变成白为1的保留下来,其他位置变成黑色为0
print("a.shape=",a.shape)
print("mask.shape=",mask.shape)
cv2.imshow("a",a)
cv2.imshow("mask",mask)
cv2.imshow("c",c)
cv2.waitKey()
cv2.destroyAllWindows()

12、加法运算

函数 cv2.add()中的参数可能有如下三种形式:
形式 1:计算结果= cv2.add(图像 1,图像 2),两个参数都是图像,此时参与运算的图像大小和类型必须保持一致
形式 2:计算结果=cv2.add(数值,图像),第1 个参数是数值,第2 个参数是图像,此时将超过图像饱和值的数值处理为饱和值(最大值)
形式 3:计算结果=cv2.add(图像,数值),第1 个参数是图像,第2 个参数是数值,此时将超过图像饱和值的数值处理为饱和值(最大值)

import cv2
import numpy as np
img1=np.ones((4,4),dtype=np.uint8)*3
img2=np.ones((4,4),dtype=np.uint8)*5
print("img1=\n",img1)
print("img2=\n",img2)
img3=cv2.add(img1,img2)
print("cv2.add(img1,img2)=\n",img3)
img4=cv2.add(img1,6)
print("cv2.add(img1,6)\n",img4)
img5=cv2.add(6,img2)
print("cv2.add(6,img2)=\n",img5)

13、图层提取

import cv2
import numpy as np
lena=cv2.imread("lena.bmp",0)
cv2.imshow("lena",lena)
r,c=lena.shape  #读取图像的行列
x=np.zeros((r,c,8),dtype=np.uint8)#有8个r*c的面,首先对每个面的每个值进行赋值成0
for i in range(8):x[:,:,i]=2**i
r=np.zeros((r,c,8),dtype=np.uint8)
for i in range(8):r[:,:,i]=cv2.bitwise_and(lena,x[:,:,i])#把这8个面分别与lena.jpg图像相与,会得到八个图像mask=r[:,:,i]>0r[mask]=255  #将像素值大于0的都设为255,目的在于提高亮度,否在值过低就接近黑色了cv2.imshow(str(i),r[:,:,i])
cv2.waitKey()
cv2.destroyAllWindows()

14、异或加密解密

import cv2
import numpy as np
lena=cv2.imread("lena.bmp",0)
r,c=lena.shape
key=np.random.randint(0,256,size=[r,c],dtype=np.uint8)# 生成随机的密钥图像
encryption=cv2.bitwise_xor(lena,key)#按位异或加密
decryption=cv2.bitwise_xor(encryption,key)#解密
cv2.imshow("lena",lena)#显示原始图像
cv2.imshow("key",key)#显示密钥图像
cv2.imshow("encryption",encryption)#显示密文图像
cv2.imshow("decryption",decryption)#显示解密后的图像
cv2.waitKey()
cv2.destroyAllWindows()

15、数字水印

import cv2
import numpy as np
#读取原始载体图像
lena=cv2.imread("lena.bmp",0)
#读取水印图像
watermark=cv2.imread("watermark.bmp",0)
#将水印内的255处理为1,以方便嵌入
#后续章节会介绍使用threshold处理。
w=watermark[:,:]>0
watermark[w]=1
#读取原始载体图像的shape值
r,c=lena.shape
#============嵌入过程============
#生成内部值都是254的数组
t254=np.ones((r,c),dtype=np.uint8)*254
#获取lena图像的高7位
lenaH7=cv2.bitwise_and(lena,t254)
#将watermark嵌入到lenaH7内
e=cv2.bitwise_or(lenaH7,watermark)
#============提取过程============
#生成内部值都是1的数组
t1=np.ones((r,c),dtype=np.uint8)
#从载体图像内,提取水印图像
wm=cv2.bitwise_and(e,t1)
print(wm)
#将水印内的1处理为255以方便显示
#后续章节会介绍threshold实现。
w=wm[:,:]>0
wm[w]=255
#============显示============
cv2.imshow("lena",lena)
cv2.imshow("watermark",watermark*255)   #当前watermark内最大值为1
cv2.imshow("e",e)
cv2.imshow("wm",wm)
cv2.waitKey()
cv2.destroyAllWindows()

16、面部打码及解码

import cv2
import numpy as np
#读取原始载体图像
lena=cv2.imread("lena.bmp",0)
#读取原始载体图像的shape值
r,c=lena.shape
mask=np.zeros((r,c),dtype=np.uint8)
mask[220:400,250:350]=1
#获取一个key,打码、解码所使用的密钥
key=np.random.randint(0,256,size=[r,c],dtype=np.uint8)
#============获取打码脸============
#使用密钥key加密原始图像lena
lenaXorKey=cv2.bitwise_xor(lena,key)
#获取加密图像的脸部信息encryptFace
encryptFace=cv2.bitwise_and(lenaXorKey,mask*255)
#将图像lena内的脸部值设置为0,得到noFace1
noFace1=cv2.bitwise_and(lena,(1-mask)*255)
#得到打码的lena图像
maskFace=encryptFace+noFace1
#============将打码脸解码============
#将脸部打码的lena与密钥key异或,得到脸部的原始信息
extractOriginal=cv2.bitwise_xor(maskFace,key)
#将解码的脸部信息extractOriginal提取出来得到extractFace
extractFace=cv2.bitwise_and(extractOriginal,mask*255)
#从脸部打码的lena内提取没有脸部信息的lena图像,得到noFace2
noFace2=cv2.bitwise_and(maskFace,(1-mask)*255)
#得到解码的lena图像
extractLena=noFace2+extractFace
#============显示图像============
cv2.imshow("lena",lena)
cv2.imshow("mask",mask*255)
cv2.imshow("1-mask",(1-mask)*255)
cv2.imshow("key",key)
cv2.imshow("lenaXorKey",lenaXorKey)
cv2.imshow("encryptFace",encryptFace)
cv2.imshow("noFace1",noFace1)
cv2.imshow("maskFace",maskFace)
cv2.imshow("extractOriginal",extractOriginal)
cv2.imshow("extractFace",extractFace)
cv2.imshow("noFace2",noFace2)
cv2.imshow("extractLena",extractLena)
cv2.waitKey()
cv2.destroyAllWindows()

4、opencv图像基本操作和算术运算16个应用案例相关推荐

  1. Opencv图像基本操作

    唐宇迪博士opencv课程学习笔记 Opencv图像基本操作 数据读取-图像 数据读取-视频 截取部分图像数据 颜色通道提取 边界填充 数值计算 图像融合 图像重构 数据读取-图像 cv2.IMREA ...

  2. OpenCV 图像基本操作

    ################################################################# [纸上得来终觉浅,绝知此事要躬行] B站视频 新课件:https:/ ...

  3. opencv 图像基本操作 像素值的获取、图像大小、ROI、通道分割与合并等

    opencv中的图像基本操作方法 访问和修改图像某像素点的值 函数 a=img[y,x] #获取像素点的值 img[y,x]=b #修改像素点的值 实例 import cv2 as cv import ...

  4. OpenCV图像基本操作——图像合成

    实验要求 现有一张4通道透明图像a.png:从其中提取出alpha通道并显示;用alpha混合,为a.png替换一张新的背景(背景图自选)png格式图片多了一个通道来显示透明度,具体如下图所示: 图片 ...

  5. Opencv图像基本操作——读取、显示、截取图像、属性、颜色通道、边界填充、图像融合

    引言 我们都会有一个疑惑:计算机眼中的图像长什么样子呢? 首先拿来一张图片分割成无数个小格,每一个小格叫做像素点,计算机中的图像是由像素点构成的像素矩阵,像素点构成它的每一个值都是在0-255之间浮动 ...

  6. 十五天掌握OpenCV——图像上的算术运算

    魏老师学生--Cecil:学习OpenCV-机器视觉之旅 图像加法 代码演示 图像混合 代码演示 按位运算 代码演示 Aim:掌握图像的:加法.减法.位运算.cv2.add().cv2.addWeig ...

  7. OpenCV计算机视觉实战 - Task1 - 一文详尽OpenCV 图像基本操作

    ################################################################# [纸上得来终觉浅,绝知此事要躬行] B站视频 新课件:https:/ ...

  8. 【OpenCV 例程200篇】16. 不同尺寸的图像加法

    [OpenCV 例程200篇]16. 不同尺寸的图像加法 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 函数 cv2 ...

  9. Opencv--Mat图像基本操作

    Opencv图像处理基本操作 1基本数据类型 图像有若干个通道,灰度图像只有一个通道,而彩色具有红,绿,蓝组成,但是OpenCv以逆序的方式来存储三个分量,还可以使用第四个透明度(alpha),可以使 ...

最新文章

  1. 使用VM虚拟机的一点小技巧
  2. 监控程序崩溃重启_第十四章 Homeassistant服务器安全及状态监控(下)
  3. 8148和8127中的ezsdk和dvrsdk
  4. php post登录跳转,php实现post跳转
  5. LeetCode_617.合并二叉树
  6. CODEVS.5037.线段树练习4加强版(分块 区间k的倍数)
  7. 剑指offer试题(PHP篇一)
  8. Chomp!博弈(巧克力游戏)
  9. Max Sum Plus Plus HDU - 1024
  10. Windiws环境安装轻量级文件服务器ftpserver
  11. Linux IO调度器相关算法介绍
  12. 综述|线结构光中心提取算法研究
  13. Jackson API 详细汇总 与 使用介绍
  14. 模糊图像退化与去模糊的数学模型
  15. 基于单片机的光立方设计
  16. 机器视觉——光源选型
  17. 优锘科技:物联森友会发布助物联网企业加速成长
  18. logisim数据选择器_【Logisim实验】构建立即数-随机存储器-寄存器的传送
  19. PPT打开出错/可尝试修复此演示文稿
  20. Input 输入调出数字输入

热门文章

  1. 【小程序支付流程,h5支付流程】
  2. Java如何遍历获取对象中的所有属性和值
  3. 六大项目权威对比 三款互联网电视横评(手机平板点餐系统应用开发)
  4. 小雨伞触达系统的优化方向的一些思考
  5. 如何在微信公众号上设置调查问卷?
  6. 错题-阅读理解-逻辑填空1
  7. 深度报告:2020年债市复盘与历次牛熊拐点分析(20210110).PDF
  8. 手机怎么修改照片大小尺寸?这两种方法轻松解决
  9. Ubuntu16.04配置pytorch环境(CPU版)
  10. 完美解决Visio中MathType公式变形的问题以及visio图转pdf之后公式不显示的问题