Python+opencv:(6)图像的运算

(6)图像的运算

import cv2                              # opencv读取的格式是BGR
# import matplotlib.pyplot as plt         # Matplotlib是RGB
import numpy as np
import time

#  .........................掩膜............................
# 掩模,也叫作掩码,英文为mask,在程序中用二值图像来表示:0值(纯黑)区域表示被遮盖的部分,255值(纯白)区域表示暴露的部分(某些场景下也会用0和1当作掩模的值)
mask = np.zeros((150, 150, 3), np.uint8)
mask[50:100, 20:80, :] = 255  # 50-100行,20-80列像素改为白色
# cv2.imshow('mask1', mask)
mask[:, :, :] = 255  # 全改为白色
mask[50:100, 20:80, :] = 0  # 50-100行,20-80列像素改为黑色
# cv2.imshow('mask2', mask)


#  .........................图像的加法运算............................
# 图像中每一个像素都有用整数表示的像素值,2幅图像相加就是让相同位置像素值相加,最后将计算结果按照原位置重新组成一幅新图像
# 1.分别使用“+”和add()方法计算图像和
img = cv2.imread('1.jpeg')
sum1 = img + img  # “+”运算符的计算结果如果超出了255,就会取相加和除以255的余数,也就是取模运算,像素值相加后反而变得更小,由浅色变成了深色
sum2 = cv2.add(img, img)  # add()方法的计算结果如果超过了255,就取值255,很多浅颜色像素彻底变成了纯白色。
# cv2.imshow('sum1', sum1)
# cv2.imshow('sum2', sum2)

# 2.模拟三色光叠加得白光
img1 = np.zeros((150, 150, 3), np.uint8)
img1[:, :, 0] = 255  # 蓝色通道赋予最大值
img2 = np.zeros((150, 150, 3), np.uint8)
img2[:, :, 1] = 255  # 绿色通道赋予最大值
img3 = np.zeros((150, 150, 3), np.uint8)
img3[:, :, 2] = 255  # 红色通道赋予最大值
img = cv2.add(img1, img2)  # 蓝+绿=青
# cv2.imshow('img1+img2', img)
img = cv2.add(img, img3)  # 红+青=白
# cv2.imshow('1+2+3', img)

# 3.利用掩模遮盖相加结果
img = cv2.add(img1, img3)  # 蓝+红=洋红
# cv2.imshow('no_mask', img)
m = np.zeros((150, 150, 1), np.uint8)  # 通道为1
m[50:100, 50:100, :] = 255  # 创建中间为白色的掩膜
# cv2.imshow('mask', m)
img = cv2.add(img1, img3, mask=m)  # 相加使用掩膜,相加的结果只会保留掩模中白色覆盖的区域
# cv2.imshow('use_mask', img)


#  .........................图像的位运算............................
# 1.按位与运算
# 1=1     1    都为一为一
# x!=y    0
# 图像做与运算时,会把每一个像素值都转为二进制数,然后让两幅图像相同位置的两个像素值做与运算,最后把运算结果保存在新图像的相同位置上
# 两特点:img与白=img,img与黑=黑,如果原图像与掩模进行与运算,原图像仅保留掩模中白色区域覆盖的内容,其他区域全部变成黑色
img = cv2.imread('1.jpeg')
mask = np.zeros(img.shape, np.uint8)
mask[100:200, :, :] = 255  # 水平白色区域
mask[:, 300:400, :] = 255  # 垂直白色区域
img = cv2.bitwise_and(img, mask)  # 与运算
# cv2.imshow('img', img)  # 图像与十字掩模做与运算,仅保留了掩模中白色区域覆盖的内容,其他区域都变成了黑色

# 2.按位或运算
# 0=0     0    都为0为0
# x!=y    1
# 两特点:img与白=白,img与黑=img,如果原图像与掩模进行或运算,原图像仅保留掩模中黑色区域覆盖的内容,其他区域全部变成白色
img = cv2.imread('1.jpeg')
mask = np.zeros(img.shape, np.uint8)
mask[100:200, :, :] = 255  # 水平白色区域
mask[:, 300:400, :] = 255  # 垂直白色区域
img = cv2.bitwise_or(img, mask)  # 或运算
# cv2.imshow('img', img)  # 图像与十字掩模做与运算,仅保留了掩模中黑色区域覆盖的内容,其他区域都变成了白色

# 3.按位取反运算
# 1->0, 0->1
img = cv2.imread('1.jpeg')
img = cv2.bitwise_not(img)  # 取反运算
# cv2.imshow('img', img)

# 4.按位异或运算
# x=y     0    同为0,异为1
# x!=y    1
# 两特点:img与白=img取反,img与黑=img,掩模白色区域覆盖的内容呈现取反效果,黑色区域覆盖的内容保持不变
img = cv2.imread('1.jpeg')
mask = np.zeros(img.shape, np.uint8)
mask[100:200, :, :] = 255  # 水平白色区域
mask[:, 300:400, :] = 255  # 垂直白色区域
img = cv2.bitwise_xor(img, mask)  # 或运算
# cv2.imshow('img', img)

# 异或运算另一特点:执行一次异或运算得到一个结果,再对这个结果执行第二次异或运算,则还原成最初的值。可进行加密解密
# 加密原理: 随机像素值图(密钥图像)  异或  原始图像   =  加密图像
# 解密原理: 加密图像  异或  随机像素值图(密钥图像)   =  原始图像
def encode(img, img_key):  # 加密解密操作,即异或运算
    result = img = cv2.bitwise_xor(img, img_key)
    return result
image = cv2.imread('1.jpeg')
# crows, colmns, channel =image.shape
img_key = np.random.randint(0, 255, image.shape, np.uint8)  # 创建与原图同样格式的密钥图像
result = encode(image, img_key)  # 加密操作
# cv2.imshow('result1', result)
result = encode(result, img_key)  # 解密操作
# cv2.imshow('result2', result)


#  .........................合并图像............................
# 1.加权和:按照不同的权重取两幅图像的像素之和组成新图像,尽量保留原有图像信息的基础上把两幅图像融合到一起
car1 = cv2.imread('1.jpeg')
car4 = cv2.imread('C:/Users/SW01/Desktop/test/4.jpeg')
rows, colmns, channel = car4.shape
car1 = cv2.resize(car1, (colmns, rows))
img = cv2.addWeighted(car1, 0.6, car4, 0.6, 0)  # 权重为0.6。标量为0,标量越大图越亮,反之越暗
# cv2.imshow('addWeighted', img)  # 利用计算加权和的方式实现多次曝光效果

# 2.覆盖:直接把前景图像显示在背景图像中,前景图像挡住背景图像。直接用修改图像像素值的方式实现图像的覆盖、拼接效果
car1 = cv2.imread('1.jpeg')
car4 = cv2.imread('C:/Users/SW01/Desktop/test/4.jpeg')
car1 = car1[50:150, 200:400, :]  # 截取200-400行,200-400列为一个图像
car1 = cv2.resize(car1, (200, 100))  # 压缩,400-200=200,150-50=100
# cv2.imshow('car1', car1)
rows, colmns, channel = car1.shape
car4[200:200+rows, 200:200+colmns, :] = car1  # 将截出的图贴到car4上
# cv2.imshow('car4', car4)

# 如果前景图像是4通道(含alpha通道)图像,直接替换整个区域的方式覆盖背景图像,因为前景图像中有透明的像素,透明的像素不应该挡住背景,所以在给背景图像像素赋值时应排除所有透明的前景像素。


cv2.waitKey()
cv2.destroyAllWindows()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值