OpenCV - 5 两图像加减乘除

相加:图像混合、添加噪声

img = cv.add(img1, img2)

img = cv.addWeighted(img1, alpha, img2, beta, gamma)

import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv


def show(img):
    if img.ndim == 2:
        plt.imshow(img, cmap='gray')
    else:
        plt.imshow(cv.cvtColor(img, cv.COLOR_RGB2GRAY))
    plt.show()


dog = cv.imread('dog.jpg', 0)
cat = cv.imread('cat.jpg', 0)
bg = cv.imread('background.jpg', 0)
mask = cv.imread('mask.jpg', 0)
cat_art = cv.imread('cat_art.jpg', 0)

# 先修正一下图像的大小
cv.imwrite('cat.jpg', cv.resize(cat, (800, 800)))
cv.imwrite('background.jpg', cv.resize(bg, (800, 800)))
cv.imwrite('mask.jpg', cv.resize(mask, (800, 800)))
cv.imwrite('cat_art.jpg', cv.resize(cat_art, (800, 800)))
cv.imwrite('dog.jpg', cv.resize(dog, (800, 800)))

show(np.hstack([cat, cat_art, dog, bg, mask]))

在这里插入图片描述

# 相加
img_add = cat + bg
show(img_add)  # 这个样子并不是我们想要的,因为元素相加时将大于255的值重新循环到另一个值

在这里插入图片描述

img_cvadd = cv.add(cat, bg)  # 大于255的数字截断于255
show(img_cvadd)

在这里插入图片描述

img_cvadd_half = cv.add(cat * 0.5, bg * 0.5)  # 大于255的数字截断于255
print(img_cvadd_half.dtype)  # float64
show(img_cvadd_half)

在这里插入图片描述

img_cvaddweight = cv.addWeighted(cat, 0.5, bg, 0.5, 0)  # 目标图、比例、噪声、比例、位移
print(img_cvaddweight.dtype)  # uint8
show(img_cvaddweight)

在这里插入图片描述

相减:消除背景、影插法(比较差异、运动跟踪)

img = cv.subtract(img1, img2)

# 相减
img_sub = (img_cvadd_half - bg * 0.5)
img_sub2 = (img_cvadd_half - bg * 0.5) * 2
show(np.hstack([img_sub, img_sub2]))

在这里插入图片描述

相乘:掩膜(mask)

img = cv.multiply(img1, img2)

# 相乘
mask = mask / 255  # 使得mask中的最大值为1
img_mul = cat * mask
show(img_mul)

在这里插入图片描述

img_mul2 = cv.multiply(cat * 1.0, mask)
show(img_mul2)

在这里插入图片描述

相除:设备校正、比较差异

img = cv.divide(img1, img2)

# 相除
img_div = cat / (np.float64(cat_art) + 1)
# show(img_div)

img_div2 = cv.divide(cat, cat_art + 1)
# show(img_div2)

show(np.hstack([img_div, img_div2]))

在这里插入图片描述

完整代码

"""
相加:图像混合、添加噪声
    img = cv.add(img1, img2)
    img = cv.addWeighted(img1, alpha, img2, beta, gamma)
相减:消除背景、影插法(比较差异、运动跟踪)
    img = cv.subtract(img1, img2)
相乘:掩膜(mask)
    img = cv.multiply(img1, img2)
相除:设备校正、比较差异
    img = cv.divide(img1, img2)
"""

import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv


def show(img):
    if img.ndim == 2:
        plt.imshow(img, cmap='gray')
    else:
        plt.imshow(cv.cvtColor(img, cv.COLOR_RGB2GRAY))
    plt.show()


dog = cv.imread('dog.jpg', 0)
cat = cv.imread('cat.jpg', 0)
bg = cv.imread('background.jpg', 0)
mask = cv.imread('mask.jpg', 0)
cat_art = cv.imread('cat_art.jpg', 0)

# 先修正一下图像的大小
cv.imwrite('cat.jpg', cv.resize(cat, (800, 800)))
cv.imwrite('background.jpg', cv.resize(bg, (800, 800)))
cv.imwrite('mask.jpg', cv.resize(mask, (800, 800)))
cv.imwrite('cat_art.jpg', cv.resize(cat_art, (800, 800)))
cv.imwrite('dog.jpg', cv.resize(dog, (800, 800)))

show(np.hstack([cat, cat_art, dog, bg, mask]))

# 相加
img_add = cat + bg
show(img_add)  # 这个样子并不是我们想要的,因为元素相加时将大于255的值重新循环到另一个值

img_cvadd = cv.add(cat, bg)  # 大于255的数字截断于255
show(img_cvadd)

img_cvadd_half = cv.add(cat * 0.5, bg * 0.5)  # 大于255的数字截断于255
print(img_cvadd_half.dtype)  # float64
show(img_cvadd_half)

img_cvaddweight = cv.addWeighted(cat, 0.5, bg, 0.5, 0)
print(img_cvaddweight.dtype)  # uint8
show(img_cvaddweight)

# 相减
img_sub = (img_cvadd_half - bg * 0.5)
img_sub2 = (img_cvadd_half - bg * 0.5) * 2
show(np.hstack([img_sub, img_sub2]))

# 相乘
mask = mask / 255  # 使得mask中的最大值为1
img_mul = cat * mask
show(img_mul)

img_mul2 = cv.multiply(cat * 1.0, mask)
show(img_mul2)

# 相除
img_div = cat / (np.float64(cat_art) + 1)
show(img_div)

img_div2 = cv.divide(cat, cat_art + 1)
show(img_div2)

show(np.hstack([img_div, img_div2]))

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个有趣的问题。我们可以使用OpenCV库来加载和处理图像。以下是代码示例: ``` python import cv2 import numpy as np # 加载图像 image1 = cv2.imread("image1.jpg") image2 = cv2.imread("image2.jpg") # 将图像拼接在一起 concatenated_image = np.concatenate((image1, image2), axis=1) # 将图像相加 added_image = cv2.add(image1, image2) # 将图像相减 subtracted_image = cv2.subtract(image1, image2) # 将图像相乘 multiplied_image = cv2.multiply(image1, image2) # 将图像相除 divided_image = cv2.divide(image1, image2) # 显示图像 cv2.imshow("Concatenated Image", concatenated_image) cv2.imshow("Added Image", added_image) cv2.imshow("Subtracted Image", subtracted_image) cv2.imshow("Multiplied Image", multiplied_image) cv2.imshow("Divided Image", divided_image) # 等待按键 cv2.waitKey(0) # 保存图像 cv2.imwrite("concatenated_image.jpg", concatenated_image) cv2.imwrite("added_image.jpg", added_image) cv2.imwrite("subtracted_image.jpg", subtracted_image) cv2.imwrite("multiplied_image.jpg", multiplied_image) cv2.imwrite("divided_image.jpg", divided_image) # 释放窗口 cv2.destroyAllWindows() ``` 在这个例子中,我们使用了OpenCV库来加载和处理图像。我们将它们转换为numpy数组,然后使用OpenCV的操作来拼接、相加、相减、相乘和相除这些图像。最后,我们将numpy数组转换为图像,并将它们保存到磁盘上。 需要注意的是,OpenCV库中的加减乘除操作是基于每个像素点的数值进行的。因此,如果我们想要对彩色图像进行相加、相减、相乘和相除的操作,需要考虑每个颜色通道的值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值