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

news/2024/10/16 2:25:06/

1.目标

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

2.图像加法

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

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

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

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

  1. 与运算(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()  # 释放所有窗体

输出结果:

 

  1. 或运算(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()  # 释放所有窗体

输出结果: 

 

  1. 非运算(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()  # 释放所有窗体

输出结果:

  1. 异或运算(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()  # 释放所有窗体

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

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


http://www.ppmy.cn/news/1462518.html

相关文章

建投数据收获客户感谢信

建投数据自2021年提出“以数据为核心的智能科技服务商”,并一直在为“成为国内领先的数字化转型合作伙伴”而努力,在赋能行业客户创造更大价值的同时,也陆续收到来自客户的肯定。 建投数据始终践行“成就客户,创新为要&#xff0…

正点原子LWIP学习笔记(二)MAC简介

MAC简介 一、MAC简介(了解)二级目录三级目录 二、ST的ETH框架(了解)三、SMI站管理接口(熟悉)四、介质接口MII、RMII(熟悉) 一、MAC简介(了解) STM32 的 MAC …

微信小程序中轮播的使用和绑定事件

轮播组件 轮播组件可以让内容在水平方向上进行轮播展示,非常适合于展示图片、广告等内容。在微信小程序中,轮播组件是通过 和 组合来实现的。 组件 组件是轮播容器,用于包裹多个轮播项。 属性: indicator-dots:是否显…

STM32-串口通信波特率计算以及寄存器的配置详解

您好,我们一些喜欢嵌入式的朋友一起建立的一个技术交流平台,本着大家一起互相学习的心态而建立,不太成熟,希望志同道合的朋友一起来,抱歉打扰您了QQ群372991598 串口通信基本原理 处理器与外部设备通信的两种方式 并行…

牛客周赛 Round 42

小红叕战小紫 #include "bits/stdc.h" using namespace std;#define int long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0); #define all(x) x.begin(),x.end() #define pi pair<int,int> #define vi vector<int> #define …

芯片半导体研发公司的数据防泄漏解决方案

在当今信息化时代&#xff0c;半导体研发公司的数据防泄密工作显得尤为重要。半导体行业涉及大量的核心技术、研发文档和客户信息&#xff0c;一旦数据泄露&#xff0c;将给企业带来无法估量的损失。因此&#xff0c;建立一套有效的数据防泄密解决方案成为半导体研发公司的当务…

Behind the Code:Polkadot 如何重塑 Web3 未来

2024 年 5 月 17 日 Polkadot 生态 Behind the Code 第二季第一集 《创造 Web3 的未来》正式上线。第一集深入探讨了 Polkadot 和 Web3 技术在解决数字身份、数据所有权和去中心化治理方面的巨大潜力。 &#x1f50d; 查看完整视频&#xff1a; https://youtu.be/_gP-M5nUidc?…

ubuntu18 安装sudo

ubuntu18 安装sudo 在Ubuntu 18.04上安装sudo通常是不必要的&#xff0c;因为sudo是Ubuntu及其衍生版本的基本包之一&#xff0c;默认情况下就已经安装。如果出于某种原因&#xff0c;sudo没有预装或者你需要升级到最新版本&#xff0c;你可以通过以下命令安装或更新它&#x…