OpenCV(Python3)_7(图像上的算术运算)

目标

图像添加

您可以通过OpenCV函数cv.add()进行两个图像的加法,或者简单地通过numpy操作res = img1 + img2 进行两个图像相加当然两张图片应该具有相同的深度和类型,或者第二张图片是标量值。

程序:

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

x = np.uint8([250])
y = np.uint8([10])

print( cv.add(x,y) )
print( x+y )

x1 = np.uint8([20])
y1 = np.uint8([10])

print( cv.add(x1,y1) )
print( x1+y1)

对两张图像进行加法时,效果会更明显。OpenCV函数将提供更好的结果。所以最好坚持使用OpenCV函数。

图像混合

这个其实也是图像的加法,但是不同的是图像被赋予不同的权重,以便给出混合或透明的感觉。图像按照以下公式添加:

                                                

通过改变α(01),你可以实现一个很酷的转换。

在这里,我拍摄了两张图像,并将它们融合在一起第一幅图像的权重为0.7,第二幅图像的权重为0.3。cv.addWeighted()在图像上应用以下等式。

                                            

其中的γ的值为零。

程序:

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

img1 = cv.imread('ml.png')
img2 = cv.imread('opencv-logo.png')

row,col,channel=img1.shape
print(img1.shape)
img2=img2[:row,:col]
print(img2.shape)

dst = cv.addWeighted(img1,0.7,img2,0.3,0)
cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()

按位操作

这包括按位AND,OR,NOT和XOR操作。在提取图像的一部分时(在之后的章节中看到的),会需要定义和使用非矩形ROI等,这时它们将非常有用。下面我们将看到一个关于如何更改图像的特定区域的示例。

我想把OpenCV徽标放在图片上方。如果我使用加法,它会改变颜色。如果我混合,则会获得透明效果。但我希望它是不透明的。如果它是一个矩形区域,我可以像上一章那样使用ROI。但OpenCV徽标不是矩形。所以你可以用下面的按位操作来完成它:

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

# Load two images
img1 = cv.imread('lena.jpg')
img2 = cv.imread('opencv-logo-white.png')

# I want to put logo on top-left corner, So I create a ROI
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]
# Now create a mask of logo and create its inverse mask also
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
#cv.imshow('mask',mask)
mask_inv = cv.bitwise_not(mask)
#cv.imshow('mask_inv',mask_inv)
# Now black-out the area of logo in ROI

img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
cv.imshow('img1_bg',img1_bg)
# Take only region of logo from logo image.
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
cv.imshow('img2_fg',img2_fg)
# Put logo in ROI and modify the main image
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv.imshow('res',img1)
cv.waitKey(0)
cv.destroyAllWindows()

结果:


猜你喜欢

转载自blog.csdn.net/qq_27806947/article/details/80739427