OpenCV - 5 两图像加减乘除

两图像加减乘除

  • 相加:图像混合、添加噪声
    • 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)
  • 完整代码

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

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

OpenCV - 5 两图像加减乘除_第1张图片

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

OpenCV - 5 两图像加减乘除_第2张图片

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

OpenCV - 5 两图像加减乘除_第3张图片

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

OpenCV - 5 两图像加减乘除_第4张图片

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

OpenCV - 5 两图像加减乘除_第5张图片

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

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

OpenCV - 5 两图像加减乘除_第6张图片

相乘:掩膜(mask)

img = cv.multiply(img1, img2)

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

OpenCV - 5 两图像加减乘除_第7张图片

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

OpenCV - 5 两图像加减乘除_第8张图片

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

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

OpenCV - 5 两图像加减乘除_第9张图片

完整代码

"""
相加:图像混合、添加噪声
    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]))

你可能感兴趣的:(Python,OpenCV,opencv)