OpenCV学习(3.2) 图像上的算术运算

1.目标

    学习图像的几种算术运算,例如加法,减法,按位运算等。

2.图像加法

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

注意 OpenCV加法和Numpy加法之间有区别。OpenCV加法是饱和运算,而Numpy加法是模运算。

  1. OpenCV 加法(饱和运算): 在 OpenCV 中,当进行图像加法操作时,如果相加的结果超出了图像像素值的表示范围(通常为 0 到 255),则会进行饱和运算。也就是说,如果相加的结果超出了像素值的表示范围,那么结果将被截断为最大值或最小值,以确保结果在合法范围内。这样可以防止图像出现明显的白色或黑色区域,保持图像的自然外观。

  2. NumPy 加法(模运算): 在 NumPy 中,当进行数组加法操作时,默认情况下会进行模运算。模运算是一种取余数的运算,当相加的结果超出了数据类型的表示范围时,会将结果取余数。这意味着结果会循环回到数据类型的表示范围内,而不会进行饱和处理。这种处理方式可能会导致图像出现明显的条纹或噪点,因为超出范围的像素值会循环到另一端,而不是被截断。

import cv2

image = '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 提供了一系列按位运算的功能,包括与、或、非、异或等操作,这些操作可以用于图像处理和图像分割等任务。下面是一些常用的按位运算操作:

  1. 与运算(AND)

    • cv2.bitwise_and(src1, src2, mask=None)
    • 对两个输入图像进行按位与运算,只有当两个对应像素的值都为非零时,输出图像对应像素的值才为非零。
import cv2
import numpy as np

car = 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()  # 释放所有窗体

输出结果:

 

  1. 或运算(OR)

    • cv2.bitwise_or(src1, src2, mask=None)
    • 对两个输入图像进行按位或运算,只要两个对应像素的值中有一个为非零,输出图像对应像素的值就为非零。
import cv2
import numpy as np

car = 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()  # 释放所有窗体

输出结果: 

 

  1. 非运算(NOT)

    • cv2.bitwise_not(src, mask=None)
    • 对输入图像进行按位非运算,即将输入图像中每个像素值取反。
import cv2
import numpy as np

car = 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()  # 释放所有窗体

输出结果:

  1. 异或运算(XOR)

    • cv2.bitwise_xor(src1, src2, mask=None)
    • 对两个输入图像进行按位异或运算,只有当两个对应像素的值不同时,输出图像对应像素的值才为非零。
import cv2
import numpy as np

car = 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 np


def encode(img, img_key):  # 加密、解密方法
    result = img = cv2.bitwise_xor(img, img_key)  # 两图像做异或运算
    return result


car = 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()  # 释放所有窗体

下面利用异或运算的特点对图像进行加密和解密

这些按位运算函数通常用于图像处理中的各种应用,例如图像融合、图像分割、二值化图像处理等。通过按位运算,可以实现对图像中特定区域的提取、合并或处理,从而实现各种图像处理任务。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值