OpenCV快速入门九:OpenCV的算术与位运算

一:算术运算

1.加法

cv2.add(img1, img2)

img1:要做加法的图像一
img2:要做加法的图像二

将两个图片进行加和,大于255的使用255计数
需要合成的两个图片大小必须一致

减法乘除类似故不做过多描述
示例:

import cv2
import numpy as np

dog = cv2.imread('./dog.jpeg')

#图的加法运算就是矩阵的加法运算
#因此,加法运算的两张图大小必须是相等的

#print(dog.shape)

img = np.ones((1200, 1920, 3), np.uint8) * 50#像素值变成50

cv2.imshow('orig', dog)

result = cv2.add(dog, img)#加法  感觉曝光一样
cv2.imshow('result', result)

orig_1 = cv2.subtract(result, img)#减法变暗 result-img
#乘multiply(A,B)
#除divide(A,B)
cv2.imshow('org_1', orig_1)

cv2.waitKey(0)

加法效果展示jia
减法效果演示减法

二:图像融合

1.融合函数

AddWeighted( InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);

src1: 表示需要加权的第一个数组,常常填一个Mat
alpha: 表示第一个数组的权重
src2: 表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数
beta: 表示第二个数组的权重值
gamma: 一个加到权重总和上的标量值。其含义通过接下来列出的式子自然会理解
dst: OutputArray 类型的dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数
dtype: 输出阵列的可选深度,有默认值-1。当两个输入数组具有相同的深度时,这个参数设置为-1 (默认值),即等同于srcl .depth()

当alpha、beta为1,gamma为0时,效果与add一样
只有两张图的属性是一样的才可以进行融合

输出图像可理解为

dst = src1 [I]*alpha+ src2[I]*beta + gamma;

2.示例

import cv2
import numpy as np

back = cv2.imread('./back.jpeg')
smallcat = cv2.imread('./smallcat1.jpeg')

#只有两张图的属性是一样的才可以进行融合
print(back.shape)
print(smallcat.shape)

result = cv2.addWeighted(smallcat, 0.7, back, 0.3, 0)
cv2.imshow('add2', result)
cv2.waitKey(0)

三:位运算

1.与运算

bitwise_and(src1, src2, dst=None, mask=None)

src1:参与与运算的图像
src2:用src2与src1进行与运算
dst:与输入具有相同大小和类型的输出数组
mask:可选操作掩码,8 位单通道数组,即指定要更改的输出数组的元素

与运输操作就是1 & 1 = 1,其他为0,可以理解为并联电路控制小灯

或、非、异或同理故不做过多描述

2.示例

import cv2
import numpy as np

#创建一张图片
img = np.zeros((200,200), np.uint8)
img2 = np.zeros((200,200), np.uint8)

img[20:120, 20:120] = 255
img2[80:180, 80:180] = 255

#new_img = cv2.bitwise_not(img)  #非  黑白颜色反转
#new_img = cv2.bitwise_and(img, img2)  #与--图像交集  全1则1  类似于串联控制灯亮  只有白色相交的地方是白色
#new_img = cv2.bitwise_or(img, img2)   #或--非0都显示
new_img = cv2.bitwise_xor(img, img2)   #异或 --交集0 


cv2.imshow('new_img', new_img)
cv2.imshow('img', img)
cv2.imshow('img2', img2)
cv2.waitKey(0)

非:颜色反转(只能操作一个数组)
yu

与:类似于交集与

或:类似于并集或

异或:交集0,其他不变
yi

四:添加水印

1.这里用到了之前学习的numpy操作

OpenCV快速入门六:图解Numpy

2,。示例

#1. 引入一幅图片,dog
#2. 要有一个LOGO,需要自己创建
#3. 计算图片在什么地方添加,在添加的地方变成黑色
#4. 利用add,将logo 与 图处叠加到一起

import cv2
import numpy as np

#导入图片
dog = cv2.imread('./dog.jpeg')

#创建LOGO和掩码
logo = np.zeros((200, 200, 3), np.uint8)
mask = np.zeros((200, 200), np.uint8)

#绘制LOGO
logo[20:120, 20:120] = [0,0,255]
logo[80:180, 80:180] = [0,255,0]

mask[20:120, 20:120] = 255
mask[80:180, 80:180] = 255

#对mask按位求反
m = cv2.bitwise_not(mask)

#选择dog添加logo的位置
roi = dog[0:200, 0:200]

#与m进行与操作
tmp = cv2.bitwise_and(roi, roi, mask = m)

dst = cv2.add(tmp, logo)

dog[0:200,0:200] = dst

cv2.imshow('dog', dog)
# cv2.imshow('dst', dst)
# cv2.imshow('tmp', tmp)
# cv2.imshow('m', m)
# cv2.imshow('mask', mask)
# cv2.imshow('logo', logo)
cv2.waitKey(0)

输出:
gou

每日“大饼”:
虽然 韶华不为少年留归 但不管我们走多远 来仍是

猜你喜欢

转载自blog.csdn.net/weixin_52051554/article/details/126368642