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

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]>0
    r[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()

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