OpenCV学习笔记(8):图像运算——图像的加减乘除、图像的融合、图像的逻辑运算

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

结果:在这里插入图片描述
觉得有用的小伙伴点个赞加个关注支持一下吧!有错误或者不恰当的地方请指出!一起学习、进步!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值