图像运算

图像的基本运算

图像加法运算,直接+号规则:如果两个像素值之和大于255,对将其除以256取其余数作为结果

import numpy as np
image1 = np.random.randint(0,256,size=[3,3],dtype=np.uint8)
image2 = np.random.randint(0,256,size=[3,3],dtype=np.uint8)
print('img1 = \n', image1)
print('img2 = \n', image2)
print('img1+img2 = \n', image1+image2)

使用cv2.add()进行加法运算,和大于255的,取255作为饱和值

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

计算两幅灰度图的像素之和(比较两种加法)

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)
cv2.waitKey()
cv2.destroyAllWindows()

图像加权和cv2.addWeighted

import cv2
a = cv2.imread('boat.bmp')
b = cv2.imread('lena.bmp')
print('a大小:',a.shape)
print('b大小:',b.shape)
c = a[30:542,100:612,:]
print('c大小:',c.shape)
#cv2.imwrite('new_boat.bmp',c)
# cv2.imshow('new_boat',c)
# cv2.waitKey()
# cv2.destroyAllWindows()
result = cv2.addWeighted(c,0.6,b,0.4,0)
cv2.imshow('new_boat',c)
cv2.imshow('lena',b)
cv2.imshow('result',result)
cv2.waitKey()
cv2.destroyAllWindows()

按位与运算cv2.bitwise_and 用数组演示与掩模图像的与运算,掩模图像只有0和255两种值

import 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)
print('a=\n',a)
print('b=\n',b)
print('c=\n',c)

保留图像中被掩模指定的部分(进行按位与运算即可)

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()

在位运算函数中加入掩模参数mask

import cv2
import numpy as np
a = cv2.imread('lena.bmp',1)
w,h,b = 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) #将a图与mask的0区域对应的区域置为0,与mask非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()

提取8位灰度图的8个位平面

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)
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])
    mask = r[:,:,i] > 0
    r[mask] = 255
    cv2.imshow(str(i),r[:,:,i])
cv2.waitKey()
cv2.destroyAllWindows()

利用密钥图像对原始图像进行加密得到加密图像再解密得到原始图像 使用按位异或运算cv2.bitwise_xor

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()

对lena脸部进行打码、解码

import cv2
import numpy as np
lena = cv2.imread('lena.bmp',0)
r,c = lena.shape
mask = np.zeros((r,c),dtype = np.uint8)
mask[220:400,250:350] = 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)
#将脸部区域置为0,得到无脸区域
noFace1 = cv2.bitwise_and(lena,(1-mask)*255)
#得到打码的lena图像
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()

参考书籍:opencv轻松入门–李立宗

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值