1.目标
学习图像的几种算术运算,例如加法,减法,按位运算等。
2.图像加法
您可以通过OpenCV函数cv.add()
或仅通过numpy操作res = img1 + img2
添加两个图像。两个图像应具有相同的深度和类型,或者第二个图像可以只是一个标量值。
注意 OpenCV加法和Numpy加法之间有区别。OpenCV加法是饱和运算,而Numpy加法是模运算。
OpenCV 加法(饱和运算): 在 OpenCV 中,当进行图像加法操作时,如果相加的结果超出了图像像素值的表示范围(通常为 0 到 255),则会进行饱和运算。也就是说,如果相加的结果超出了像素值的表示范围,那么结果将被截断为最大值或最小值,以确保结果在合法范围内。这样可以防止图像出现明显的白色或黑色区域,保持图像的自然外观。
NumPy 加法(模运算): 在 NumPy 中,当进行数组加法操作时,默认情况下会进行模运算。模运算是一种取余数的运算,当相加的结果超出了数据类型的表示范围时,会将结果取余数。这意味着结果会循环回到数据类型的表示范围内,而不会进行饱和处理。这种处理方式可能会导致图像出现明显的条纹或噪点,因为超出范围的像素值会循环到另一端,而不是被截断。
import cv2image = 'D:\papercode\AI\Ai-Dentist-Sample-Code-main\opencv\car_recognition\car.jpg'#读取图片
img1 = cv2.imread(image,cv2.IMREAD_GRAYSCALE)img2 = cv2.imread(image)
img_b = img2[:,:,0]
img_np = img_b + img1
cv2.imshow('img_np',img_np)
img_add = cv2.add(img_b,img1)
cv2.imshow('img_add',img_add)cv2.waitKey(0)
cv2.destoryALLWimdows()
其中,img1是该图像的灰度图,img_b是该图像蓝色通道,img_np是采用numpy操作,img_add是采用cv2.add操作,结果如下:
3.图像融合
这也是图像加法,但是对图像赋予不同的权重,以使其具有融合或透明的感觉。根据以下等式添加图像:
G(x)=(1−α)f0(x)+αf1(x)𝐺(𝑥)=(1−𝛼)𝑓0(𝑥)+𝛼𝑓1(𝑥)
通过从 α𝛼 从 0→10→1 更改,您可以在一个图像到另一个图像之间执行很酷的过渡。
在这里,我拍摄了两个图像,将它们融合在一起。第一幅图像的权重为0.7,第二幅图像的权重为0.3。cv.addWeighted()
在图像上应用以下公式。
dst=α⋅img1+β⋅img2+γ𝑑𝑠𝑡=𝛼⋅𝑖𝑚𝑔1+𝛽⋅𝑖𝑚𝑔2+𝛾
在这里,γ𝛾 被视为零。
示例:
dst = cv2.addWeighted(img_np,0.7,img_add,0.3,0)
4.按位运算
在 OpenCV 中,按位运算是对图像进行逐像素的位级别操作的一种技术。OpenCV 提供了一系列按位运算的功能,包括与、或、非、异或等操作,这些操作可以用于图像处理和图像分割等任务。下面是一些常用的按位运算操作:
-
与运算(AND):
cv2.bitwise_and(src1, src2, mask=None)
- 对两个输入图像进行按位与运算,只有当两个对应像素的值都为非零时,输出图像对应像素的值才为非零。
import cv2
import numpy as npcar = cv2.imread(image) # 车原始图像
mask = np.zeros(car.shape, np.uint8) # 与车图像大小相等的掩模图像
mask[280:380, :, :] = 255 # 横着的白色区域
mask[:, 280:480, :] = 255 # 竖着的白色区域
img = cv2.bitwise_and(car, mask) # 或运算
cv2.imshow("car", car) # 展示车图像
cv2.imshow("mask", mask) # 展示掩模图像
cv2.imshow("img", img) # 展示或运算结果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
输出结果:
-
或运算(OR):
cv2.bitwise_or(src1, src2, mask=None)
- 对两个输入图像进行按位或运算,只要两个对应像素的值中有一个为非零,输出图像对应像素的值就为非零。
import cv2
import numpy as npcar = cv2.imread(image) # 车原始图像
mask = np.zeros(car.shape, np.uint8) # 与车图像大小相等的掩模图像
mask[280:380, :, :] = 255 # 横着的白色区域
mask[:, 280:480, :] = 255 # 竖着的白色区域
img = cv2.bitwise_or(car, mask) # 或运算
cv2.imshow("car", car) # 展示车图像
cv2.imshow("mask", mask) # 展示掩模图像
cv2.imshow("img", img) # 展示或运算结果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
输出结果:
-
非运算(NOT):
cv2.bitwise_not(src, mask=None)
- 对输入图像进行按位非运算,即将输入图像中每个像素值取反。
import cv2
import numpy as npcar = cv2.imread(image) # 车原始图像
mask = np.zeros(car.shape, np.uint8) # 与车图像大小相等的掩模图像
# mask[280:380, :, :] = 255 # 横着的白色区域
# mask[:, 280:480, :] = 255 # 竖着的白色区域
img = cv2.bitwise_not(car, mask) # 或运算
cv2.imshow("car", car) # 展示车图像
# cv2.imshow("mask", mask) # 展示掩模图像
cv2.imshow("img", img) # 展示或运算结果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
输出结果:
-
异或运算(XOR):
cv2.bitwise_xor(src1, src2, mask=None)
- 对两个输入图像进行按位异或运算,只有当两个对应像素的值不同时,输出图像对应像素的值才为非零。
import cv2
import numpy as npcar = cv2.imread(image) # 车原始图像
mask = np.zeros(car.shape, np.uint8) # 与车图像大小相等的掩模图像
mask[280:380, :, :] = 255 # 横着的白色区域
mask[:, 280:480, :] = 255 # 竖着的白色区域
img = cv2.bitwise_xor(car, mask) # 或运算
cv2.imshow("car", car) # 展示车图像
cv2.imshow("mask", mask) # 展示掩模图像
cv2.imshow("img", img) # 展示或运算结果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
输出结果:
异或的加密使用,首先 执行一次异或运算得到一个结果,再对这个结果执行第二次异或运算,则还原成最初的值,利用这个特点可以实现对图像内容的加密和解密
import cv2
import numpy as npdef encode(img, img_key): # 加密、解密方法result = img = cv2.bitwise_xor(img, img_key) # 两图像做异或运算return resultcar = cv2.imread(image) # 车原始图像
rows, colmns, channel = car.shape # 原图像的行数、列数和通道数
# 创建与花图像大小相等的随机像素图像,作为密钥图像
img_key = np.random.randint(0, 256, (rows, colmns, 3), np.uint8)cv2.imshow("1", car) # 展示车图像
cv2.imshow("2", img_key) # 展示秘钥图像result = encode(car, img_key) # 对车图像进行加密
cv2.imshow("3", result) # 展示加密图像
result = encode(result, img_key) # 对车图像进行解密
cv2.imshow("4", result) # 展示加密图像
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
下面利用异或运算的特点对图像进行加密和解密
这些按位运算函数通常用于图像处理中的各种应用,例如图像融合、图像分割、二值化图像处理等。通过按位运算,可以实现对图像中特定区域的提取、合并或处理,从而实现各种图像处理任务。