OpenCV学习笔记(8):图像运算——图像的加减乘除、图像的融合、图像的逻辑运算
文章目录
01 图像的加减乘除 cv2.add cv2.subtract cv2.multiply cv2.divide
学习目标:加减乘除里边也就加法有点用!!!其他了解即可
加法运算 cv2.add()
# add(src1, src2, dst=None, mask=None, dtype=None)
其他类似,不再写函数的参数
cv2.add 加法操作要求两个图片的长宽相同,通道数相同
在做加法之前,需要把图片的形状变得完全一致才行
可以通过cv2.resize实现,目前还没学到,这里先不用
所以先通过ndarray切片方式取出完全一样的形状,相当于裁剪
# 01 图像运算及加减乘除 cv2.add cv2.subtract cv2.multiply cv2.divide
def add_sub_mul_div_substract():
# 加法运算 cv2.add()
# add(src1, src2, dst=None, mask=None, dtype=None)
# 读取图片
girl_1 = cv2.imread('picture.png')
girl_2 = cv2.imread('picture_2.png')
# print(girl_1.shape, girl_2.shape) # (500, 500, 3) (1387, 640, 3)
# 第二个图片更大,切第二个
new_girl_2 = girl_2[0:500, :500] # 左闭右开,死记!计算机里边的切片从来都是左闭右开的
# print(new_girl_2.shape)
add_img = cv2.add(girl_1, new_girl_2)
cv2.imshow('add', add_img)
cv2.imshow('yuantu', girl_1)
cv2.imshow('new_girl_2', new_girl_2)
cv2.waitKey(0)
cv2.destroyAllWindows()
add 的运算规则就是两个图对应位置的元素相加,如果超过255,全部变成255
变得很白很亮了
测试一下
print(girl_1[:3, :3, 0], '+\n', girl_2[:3, :3, 0], '=\n', add_img[:3, :3, 0])
[[241 241 241]
[241 241 241]
[241 241 241]] +
[[216 216 214]
[216 216 214]
[214 214 214]] =
[[255 255 255]
[255 255 255]
[255 255 255]]
图片还可以和单个数字进行运算
在上述函数中增加以下代码:
# 图片还可以和单个数字进行运算
img1 = girl_1 + 100 # 每个数字和100进行加法运算,超出255的数字会被截断,相当于%255
cv2.imshow('girl_1+100', img1)
img2 = girl_1 - 100
cv2.imshow('girl_1-100', img2)
结果为:左为girl+100,右为girl-100
当然,也可以做图像的减法。
减法 cv2.substract()
运算规则:对应位置元素相减,如果小于零令其等零
sub_img = cv2.subtract(new_girl_2, girl_1)
sub_img_2 = cv2.subtract(girl_1, new_girl_2)
cv2.imshow('sub', sub_img)
cv2.imshow('sub_2', sub_img_2)
先后顺序 谁减谁 有点恐怖有没有~不!极其恐怖!!!
乘法 cv2.multiply()
除法 cv2.divide()
# 乘法 multiply
mul_img = cv2.multiply(girl_1, new_girl_2)
cv2.imshow('mul_img', mul_img)
# 除法 divide
div_img = cv2.divide(girl_1, new_girl_2)
cv2.imshow('div_img', div_img)
因为相乘太大,相除又太小,所以会几乎全白或者全黑。
总结:也就加法有点用,其他运算图片就看不过去,没啥用
02 图像的融合 cv2.addWeighted
区别于上边图像的加法,图像的融合更灵活一点
# addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)
# dst = src1*alpha + src2*beta + gamma;
不是简单的加法了,相当于拿图片做了线性运算 new_img = img1 * w1 + img2 * w2 + bias
w1和w2是权重值,bias是偏差
# 02 图像的融合 cv2.addWeighted
def addWeighted():
# addWeighted 比单纯的加法灵活一点
# 不是简单的加法了,相当于拿图片做了线性运算 new_img = img1 * w1 + img2 * w2 + bias
# addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)
# dst = src1*alpha + src2*beta + gamma;
# 读取图片
girl_1 = cv2.imread('picture.png')
girl_2 = cv2.imread('picture_2.png')
# 第二个图片更大,切第二个
new_girl_2 = girl_2[0:500, :500]
new_img = cv2.addWeighted(girl_1, 0.3, new_girl_2, 0.7, 0)
new_img2 = cv2.addWeighted(girl_1, 0.7, new_girl_2, 0.3, 0)
new_img3 = cv2.addWeighted(girl_1, 0.7, new_girl_2, 0.3, -100)
# ps:建议0-1之间,否则按照公式计算时,若设较大,会全白的
cv2.imshow('new_girl', new_img)
cv2.imshow('new_girl2', new_img2)
cv2.imshow('new_girl3', new_img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果:
分析:第一张图片和第二张图片对比,可以发现权重越大,该图像显示越明显;第三张图像在第二张图像的基础上,所以像素值减少了100,所以会变黑。
03 OpenCV的逻辑运算–与 或 非 异或 cv2.bitwise_not and or xor
opencv的逻辑运算就是对应位置元素进行与或非、异或
OpencCV中的非运算:bitwise_not
0反过来是255 但是python中 ~0=-1 ~255=-256
# 03 opencv的逻辑运算--与 或 非 异或
def logic_calculation():
# opencv的逻辑运算就是对应位置元素进行与或非、异或
# opencv中的非,0反过来是255 但是python中 ~0=-1 ~255=-256
girl = cv2.imread('picture.png')
girl_2 = cv2.imread('picture_2.png')
# 非操作 bitwise_not
girl_not = cv2.bitwise_not(girl)
cv2.imshow('not', np.hstack((girl, girl_not))) # 以前用过的,将数组水平合并,还有一个vstack 竖直合并 horizontal vertical
print(girl[:2, :2])
print(girl_not[:2, :2])
# 仔细看图,白的变黑的,背景等,相当于255-girl
cv2.waitKey(0)
cv2.destroyAllWindows()
logic_calculation()
注意1:numpy.hstack() 将两个数组在水平方向上合并,这里为了方便显示;以及在竖直方向上合并的 numpy.vstack() 有兴趣的可以尝试一下。l来源于这两个单词:horizontal vertical
注意2:看printf。可以利用此方法对后边与、或、异或等操作逐个元素进行验证
结果:
仔细看图,白的变黑的,背景等,相当于255-girl
OpencCV中的与运算:bitwise_and
非是单目运算符,所以只需要一张图,而与、或和异或均需要两个输入。
# 与操作 bitwise_and
new_girl = girl_2[0:500, :500]
girl_and = cv2.bitwise_and(girl, new_girl)
cv2.imshow('and', np.hstack((new_girl, girl_and)))
注意第二幅图像,变黑了因为只有两个都是1的时候才为1,也就是两个像素与之后结果会变小。
OpencCV中的或运算:bitwise_or
# 或操作 bitwise_or
girl_or = cv2.bitwise_or(new_girl, girl)
cv2.imshow('or', np.hstack((new_girl, girl_or)))
# or变白了 看元素可以发现数值变大了
结果:
or变白了 看元素可以发现数值变大了,这里需要与对比与运算的结果。
OpencCV中的异或运算:bitwise_xor
# 异或 bitwise_xor
girl_xor = cv2.bitwise_xor(new_girl, girl)
cv2.imshow('girl_xor', np.hstack((new_girl, girl_xor)))
结果:
觉得有用的小伙伴点个赞加个关注支持一下吧!有错误或者不恰当的地方请指出!一起学习、进步!!!