Python-OpenCV入门(3)-图像运算

01

随着人工智能的不断发展,OpenCV这门技术也越来越重要,很多人都开启了学习OpenCV,本文就介绍了OpenCV的基础内容。

图像运算指以图像为单位进行的搡作(该操作对图像中的所有像素同样进行),运算的结果是一幅其灰度分布与原来参与运算图像灰度分布不同的新图像。具体的运算主要包括算术和逻辑运算,它们通过改变像素的值来得到图像增强的效果。

算术和逻辑运算中每次只涉及一个空间像素的位置,所以可以“原地”完成,即在(x,y)位置做一个算术运算或逻辑运算的结果可以存在其中一个图像的相应位置,因为那个位置在其后的运算中不会再使用。换句话说,设对两幅图像f(x,y) 和h(x,y)的算术或逻辑运算的结果是g(x,y),则可直接将g(x,y)覆盖f(x,y)或h(x,y),即从原存放输入图像的空间直接得到输出图像。

图像的基本运算:相加、相减、相乘、相除、位运算、平方根、对数、绝对值等;
图像也可以放大、缩小、旋转,还可以截取其中的一部分作为ROI(感兴趣区域)进行操作;
各个颜色通道还可以分别提取及对各个颜色通道进行各种运算操作。
· 学习图像上的算术运算,加法,减法,位运算等。
·相关函数:cv2.add(),cv2.addWeighted() 等。

本片文章的目标:

  1. 能够理解图像算术运算的概念
  2. 能够使用对应函数实现图像加减乘除
  3. 能够使用加权相加函数实现应用
  4. 能够理解图像逻辑运算应用场景
  5. 能够使用相关函数实现图像加密、面部打码、数字水印

line

01
算数运算

1首先,我们使用加号进行简单的图像运算,使用matplotlib绘图并查看图像像素变化

Python-OpenCV入门(3)-图像运算_第1张图片
Python-OpenCV入门(3)-图像运算_第2张图片

#导入所需的库
import cv2 
import numpy as np
#读取图像
img1=cv2.imread("LinuxLogo.jpg")
img2=cv2.imread("WindowsLogo.jpg")
#进行图像简单相加
img3=img1+img2

cv2.imshow("add",img3)
cv2.waitKey()
cv2.destroyAllWindows()

Python-OpenCV入门(3)-图像运算_第3张图片

2使用OpenCV自带的函数进行图像运算

#加法运算
def add_demo(m1, m2):
    dst = cv2.add(m1, m2)
    cv2.imshow("add_demo", dst)
#减法运算
def subtract_demo(m1, m2):
    dst = cv2.subtract(m1, m2)
    cv2.imshow("subtract_demo", dst)
#乘法运算
def divide_demo(m1, m2):
    dst = cv2.divide(m1, m2)
    cv2.imshow("divide_demo", dst)
#除法运算
def multiply_demo(m1, m2):
    dst = cv2.multiply(m1, m2)
    cv2.imshow("multiply_demo", dst)
#加权和运算,应用于亮度与对比度调整
def contrast_brightness_demo(image, c, b):
    h, w, ch = image.shape
    blank = np.zeros([h, w, ch], image.dtype)
    dst = cv2.addWeighted(image, c, blank, 1-c, b)
    cv2.imshow("con-bri-demo", dst)
#导入所需的库
import cv2 
import numpy as np
#读取图像
img1=cv2.imread("LinuxLogo.jpg")
img2=cv2.imread("WindowsLogo.jpg")
add_demo(img1,img2)
subtract_demo(img1,img2)
divide_demo(img1,img2)
multiply_demo(img1,img2)
contrast_brightness_demo(img2,1.2,10)
cv2.waitKey(0)
cv2.destroyAllWindows()

Python-OpenCV入门(3)-图像运算_第4张图片
Python-OpenCV入门(3)-图像运算_第5张图片
Python-OpenCV入门(3)-图像运算_第6张图片
Python-OpenCV入门(3)-图像运算_第7张图片
Python-OpenCV入门(3)-图像运算_第8张图片

使用cv2.add()将两个图像相加,可以使用numpy中的矩阵加法来实现。
但是在opencv中加法是饱和操作,也就是有上限值,numpy会对结果取模。

3练习:实现ppt页面切换的功能,关键函数:addWeighted()

#导入所需的库
import cv2 
#读取图像
img1=cv2.imread("LinuxLogo.jpg")
img2=cv2.imread("WindowsLogo.jpg")
l,h=img1.shape[0:2]
a=0
dst=cv2.addWeighted(img1,a,img2,1-a,-1)
while a<1.0:
    dst=cv2.addWeighted(img1,a,img2,1-a,-1.0)
    cv2.imshow('ppt',dst)
    cv2.waitKey(100)
    a+=0.02
cv2.waitKey(0)
cv2.destroyAllWindows()

ppt

02
逻辑运算

#按位与 按位或
def logic_demo(m1, m2):
    dst1 = cv2.bitwise_and(m1, m2)
    dst2 = cv2.bitwise_or(m1, m2)
    cv2.imshow("logic_demo_and", dst1)
    cv2.imshow("logic_demo_or",dst2)
#按位非运算 按位异或
def logic_demo2(m1,m2):
    dst1=cv2.bitwise_not(m1,m2)
    dst2=cv2.bitwise_xor(m1,m2)
    cv2.imshow("logic_demo_not", dst1)
    cv2.imshow("logic_demo_xor",dst2)
#导入所需的库
import cv2 
#实现
img1=cv2.imread("LinuxLogo.jpg")
img2=cv2.imread("WindowsLogo.jpg")
logic_demo(img1,img2)
logic_demo2(img2,img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

03
逻辑运算综合应用

Python-OpenCV入门(3)-图像运算_第9张图片
Python-OpenCV入门(3)-图像运算_第10张图片
Python-OpenCV入门(3)-图像运算_第11张图片
Python-OpenCV入门(3)-图像运算_第12张图片

1图像加密

import cv2
import numpy as np
 
demo = cv2.imread("kdx.jpg", 0)
r, c = demo.shape
key = np.random.randint(0, 256, size=(r, c), dtype=np.uint8)   # 生成随机的密钥图像
 
# cv2.imshow("kdx", demo)              # 显示原始图像
cv2.imshow("key", key)                # 显示密钥图像
 
encryption = cv2.bitwise_xor(demo, key)   # 加密
decryption = cv2.bitwise_xor(encryption, key)  # 解密
 
cv2.imshow("jiami", encryption)      # 显示密文图像
cv2.imshow("jiemi", decryption)      # 显示解密后的图像
 
cv2.waitKey(-1)
cv2.destroyAllWindows()

Python-OpenCV入门(3)-图像运算_第13张图片
Python-OpenCV入门(3)-图像运算_第14张图片
Python-OpenCV入门(3)-图像运算_第15张图片

2面部打码以及解码

lena=cv2.imread("kdx.jpg",0)
r,c=lena.shape
mask=np.zeros((r,c),dtype=np.uint8)
mask[320:610,200:545]=1
key=np.random.randint(0,256,size=[r,c],dtype=np.uint8) # 获取密匙

lenaXorKey=cv2.bitwise_xor(lena,key)  # 对原图像加密
encryptFace=cv2.bitwise_and(lenaXorKey,mask*255) # 获取加密图的脸部信息
noFace1=cv2.bitwise_and(lena,(1-mask)*255)     # 将原图的脸部位置置0
maskFace=encryptFace+noFace1                # 得到打码的原图

# 解码
extractOriginal=cv2.bitwise_xor(maskFace,key)   # 得到脸部的原始信息
extractFace=cv2.bitwise_and(extractOriginal,mask*255)  # 提取脸部信息
noFace2=cv2.bitwise_and(maskFace,(1-mask)*255)  # 从打码的原图内提取没有脸的原图
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()

Python-OpenCV入门(3)-图像运算_第16张图片
Python-OpenCV入门(3)-图像运算_第17张图片

04
总结

以上就是今天要讲的内容,本次主要介绍了图像的基本图像运算、图像加权和、按位逻辑运算以及使用它们来掩膜进行图像打码/解码等操作,我们先需要牢靠的掌握基础操作,对于更好的实现图像处理是非常有必要的。

line
end

点个关注不迷路
觉得孔哥写的对你有帮助?请分享给更多的人
欢迎一起学习!博客平台同步发布,请搜索——和孔哥一起学

dianzan

版权声明:
作者: 和孔哥一起学
导师:Fu Xianjun
本文版权归作者导师共有,欢迎转载,但未经作者同意必须在文章页面注明来源及原作者或原文链接,否则保留追究法律责任的权利。

你可能感兴趣的:(python,opencv,笔记,python)