python-opencv Tutorials 一码人翻译(8)核心操作 对图像算术运算

  • 目标

学习一些关于加法、减法、位运算等图像的算术运算。

您将学习这些功能:cv.add()、cv.add加权()等。

  • 图片添加

您可以通过OpenCV函数、cv.add()或简单的numpy操作来添加两个图像,res=img1+img2。这两个图像应该具有相同的深度和类型,或者第二个图像可以是一个标量值。

请注意

OpenCV添加和Numpy添加之间是有区别的。OpenCV添加是一个饱和的操作,而Numpy添加是一个模块化操作。

例如,以下示例:

import numpy as np

import cv2 as cv

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

print( cv.add(x,y) ) # 250+10 = 260 => 255


print( x+y )          # 250+10 = 260 % 256 = 4
[[255]]
[4]

当你加两个图像时,它会更明显。OpenCV功能将提供更好的结果。所以最好还是坚持使用 

  • 图像融合

这也是图像的添加,但是不同的权重被赋予图像,这样它就会产生混合或透明的感觉。图像是根据下面的方程添加的:

你可以在一个图像到另一个图像之间进行一个很酷的转换。

在这里,我用了两张图片把它们混合在一起。第一个图像的权重是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()

 

 

按位操作

这包括位和,或,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('lenna.jpg')
img2 = cv.imread('python.jpg')

# 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)
mask_inv = cv.bitwise_not(mask)

# Now black-out the area of logo in ROI
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)

# Take only region of logo from logo image.
img2_fg = cv.bitwise_and(img2,img2,mask = mask)

# 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_41905045/article/details/81299272