opencv基础09-图像运算之-加法运算(图像增强预处理)

news2025/2/3 4:34:01

opencv基础09-图像运算

什么是图像运算?

在图像处理过程中,经常需要对图像进行加法运算。可以通过加号运算符“+”对图像进行加法运算,也可以通过 cv2.add()函数对图像进行加法运算。
通常情况下,在灰度图像中,像素用 8 个比特位(一个字节)来表示,像素值的范围是[0,255]。
两个像素值在进行加法运算时,求得的和很可能超过 255。上述两种不同的加法运算方式,对超过 255 的数值的处理方式是不一样的。

图像运算能干嘛?

图像运算是指对图像进行各种数学和逻辑操作的过程,可以用于许多功能场景。以下是一些图像运算在不同功能场景下的应用:

图像增强和预处理:图像运算可以用于增强和预处理图像,如对比度增强、亮度调整、颜色校正、噪声去除、图像平滑和锐化等。这在图像处理、计算机视觉和图像分析中常用于提高图像质量和准确性。

特征提取和描述符:图像运算可用于提取图像中的特征和描述符,如边缘检测、角点检测、纹理分析和形状描述等。这在目标检测、图像匹配、物体识别和图像检索等领域中非常重要。

图像分割和区域提取:图像运算可以用于图像分割和区域提取,如阈值分割、基于边缘的分割、区域增长和分水岭算法等。这在图像分析、计算机视觉和医学图像处理中常用于提取感兴趣的区域和物体。

图像合成和融合:图像运算可以用于图像合成和融合,如图像叠加、混合模式、泊松融合和全景图像拼接等。这在图像合成、图像编辑和增强现实等应用中常用于创建合成图像和增强效果。

图像变换和几何操作:图像运算可以用于图像的变换和几何操作,如图像缩放、旋转、平移、仿射变换和透视变换等。这在图像配准、图像校正和图像变换等领域中非常有用。

图像分析和模式识别:图像运算可以用于图像分析和模式识别任务,如形状识别、运动分析、纹理分类和目标跟踪等。这在计算机视觉、机器学习和人工智能等领域中广泛应用。

图像压缩和编码:图像运算可以用于图像压缩和编码,如基于变换的压缩、预测编码和无损压缩等。这在数字图像传输、存储和通信中常用于减小图像文件大小和提高传输效率。

总而言之,图像运算在图像处理、计算机视觉、图像分析和模式识别等领域具有广泛的应用。它们可以用于处理、增强、分析和理解图像,从而实现不同的功能和应用场景。

加号运算符

使用加号运算符“+”对图像 a(像素值为 a)和图像 b(像素值为 b)进行求和运算时,
遵循以下规则:

在这里插入图片描述
上面公式中,mod()是取模运算,“mod(a+b, 256)”表示计算“a+b 的和除以 256 取余数”。
根据上述规则,两个点进行加法运算时:
 如果两个图像对应像素值的和小于或等于 255,则直接相加得到运算结果。例如,像素值 28 和像素值 36 相加,得到计算结果 64。
 如果两个图像对应像素值的和大于 255,则将运算结果对 256 取模。例如 255+58=313,
大于 255,则计算(255+58)% 256 = 57,得到计算结果 57。
当然,上述公式也可以简化为𝑎 + 𝑏 = mod(𝑎 + 𝑏, 256),在运算时无论相加的和是否大于255,都对数值 256 取模。

示例

使用随机数数组模拟灰度图像,观察使用“+”对像素值求和的结果。
分析:通过将数组的数值类型定义为 dtype=np.uint8,可以保证数组值的范围在[0,255]之间。

import numpy as np
img1=np.random.randint(0,256,size=[3,3],dtype=np.uint8)
img2=np.random.randint(0,256,size=[3,3],dtype=np.uint8)
print("img1=\n",img1)
print("img2=\n",img2)
print("img1+img2=\n",img1+img2)

运行结果:

img1=
 [[ 86  14 150]
 [ 29 157 182]
 [153  51 205]]
img2=
 [[140  47 210]
 [225 104  35]
 [ 20  42   7]]
img1+img2=
 [[226  61 104]
 [254   5 217]
 [173  93 212]]

从上述程序可以看到,使用“+”计算两个 256 级灰度图像内像素值的和时,运算结果会
对 256 取模。
需要注意,本例题中的加法要进行取模,这是由数组的类型 dtype=np.uint8 所规定的。

cv2.add()函数

函数 cv2.add()可以用来计算图像像素值相加的和,其语法格式为:
计算结果=cv2.add(像素值 a,像素值 b)
使用函数 cv2.add()对像素值 a 和像素值 b 进行求和运算时,会得到像素值对应图像的饱和值(最大值)。
例如,8 位灰度图像的饱和值为 255,因此,在对 8 位灰度图的像素值求和时,遵循以下规则:
在这里插入图片描述

根据上述规则,在 256 级的灰度图像(8 位灰度图)中的两个像素点进行加法运算时:

  1. 如果两个像素值的和小于或等于 255,则直接相加得到运算结果。例如,像素值 28 和 像素值 36 相加,得到计算结果 64。
  2. 如果两个像素值的和大于 255,则将运算结果处理为饱和值 255。例如 255+58=313,大于 255,则得到计算结果 255——*(*与直接相加不同,这里不取模运算)。
    需要注意,函数 cv2.add()中的参数可能有如下三种形式。
    形式 1:
    计算结果=cv2.add(图像 1,图像 2),两个参数都是图像,此时参与运算的图像大小和类型必须保持一致。
    形式 2:
    计算结果=cv2.add(数值,图像),第 1 个参数是数值,第 2 个参数是图像,此时将超过图像饱和值的数值处理为饱和值(最大值)。
    形式 3:
    计算结果=cv2.add(图像,数值),第 1 个参数是图像,第 2 个参数是数值,此时将超过图像饱和值的数值处理为饱和值(最大值)。

形式2,3 看着有点蒙,我们直接上代码看效果

形式1 示例代码:

import numpy as np
import cv2
img1=np.random.randint(0,256,size=[3,3],dtype=np.uint8)
img2=np.random.randint(0,256,size=[3,3],dtype=np.uint8)
print("img1=\n",img1)
print("img2=\n",img2)
img3=cv2.add(img1,img2)
print("cv2.add(img1,img2)=\n",img3)

运行结果:

img1=
 [[ 80 210 173]
 [112  85  13]
 [158 230  45]]
img2=
 [[  9 221  81]
 [255   2 127]
 [124 147   9]]
cv2.add(img1,img2)=
 [[ 89 255 254]
 [255  87 140]
 [255 255  54]]

形式2 示例代码:

import numpy as np
import cv2

#读取图像,并以灰度图像的方式显示,参数为0
a = cv2.imread("lena.png",0)

# 将图像转换为NumPy数组
image_np = np.array(a)

print("image_np=\n",image_np)

cv2.imshow("original",a)
#对图像进行加法运算
result2=cv2.add(100,a)

image_np_r  = np.array(result2)

print("image_np_r=\n",image_np_r)

cv2.imshow("result2",result2)

cv2.waitKey()
cv2.destroyAllWindows()

像素值运算结果:

image_np=
 [[139 144 141 ... 103 103 103]
 [142 143 140 ... 105 105 105]
 [144 137 145 ... 105 103 102]
 ...
 [117 119 123 ...  50  50  50]
 [115 118 119 ...  50  50  53]
 [109 116 117 ...  50  53  56]]
image_np_r=
 [[239 244 241 ... 203 203 203]
 [242 243 240 ... 205 205 205]
 [244 237 245 ... 205 203 202]
 ...
 [217 219 223 ... 150 150 150]
 [215 218 219 ... 150 150 153]
 [209 216 217 ... 150 153 156]]

从结果看图片所有的像素点都加了100,

运行显示效果:
在这里插入图片描述

形式3 示例代码:

import numpy as np
import cv2

#读取图像,并以灰度图像的方式显示,参数为0
a = cv2.imread("lena.png",0)

cv2.imshow("original",a)
#对图像进行加法运算
result2=cv2.add(a,100)

cv2.imshow("result2",result2)

cv2.waitKey()
cv2.destroyAllWindows()

运行效果:

在这里插入图片描述
发现亮度也提高了

更多效果自己多实验,看代码是看不出所以然的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美颜滤镜SDK:打造个性化直播体验的关键工具

时下,美颜滤镜SDK则成为了打造个性化直播体验的关键工具。美颜滤镜SDK,顾名思义,就是一种可以为直播画面添加美颜效果的软件开发工具包。通过该SDK,用户可以在直播过程中使用各种美颜滤镜,让自己的肌肤更加细腻、光滑&…

云原生之深入解析K8S中Ceph的部署与功能测试

一、前言 Ceph 在 k8s 中用做共享存储还是非常方便的,Ceph 是比较老牌的分布式存储系统,非常成熟并且功能也强大,支持三种模式(快存储、文件系统存储、对象存储),那么如何在 k8s 使用 ceph 呢?…

横向滚动日期显示对应周几

common.js: //获取当前时间&#xff0c;格式YYYY-MM-DD HH:MM:SS const GetNowTime time > {var date time,year date.getFullYear(),month date.getMonth() 1,day date.getDate(),hour date.getHours() < 10 ? "0" date.getHours() : date.getHours…

前端学习——ajax (Day1)

AJAX 概念和 axios 使用 axios 使用 练习 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" …

docker-compose安装redis高可用哨兵集群(一主二从三哨兵)

以redis 7.0为例子 直接上代码 docker-compose.yaml version: 3.3 services:master:image: redis:7.0container_name: redis-master#restart: alwayscommand: redis-server --port 6379 --requirepass root --appendonly yes --masterauth root --replica-announce-ip 192.1…

什么是 TCP 和 UDP?Java 中如何实现 TCP 和 UDP 协议

在计算机网络中&#xff0c;TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;是两种最常用的传输层协议。它们都用于在网络上传输数据&#xff0c;但是它们之间有很多不同之处。本文将介绍TCP和UDP的基本概念&#xff0c;以及在Java中如何…

一、基础-4、MySQL启动和客户端连接

一、启动 方法一&#xff1a; 1、winR&#xff0c;输入services.msc&#xff0c;按回车 2、找到MySQL&#xff0c;右键-启动/停止 MySQL安装后&#xff0c;默认已启动。 方法二、 1、winR&#xff0c;输入cmd&#xff0c;打开命令行 2、输入启动与停止命令 二、客户端连接 …

港联证券-“肉签”频出!这周打新看TA们→

近期&#xff0c;新股市场有所回暖&#xff0c;“赚钱效应”随之提高。Choice数据显现&#xff0c;上星期8只新股的上市首日均匀涨幅为56%&#xff0c;呈逐周上涨态势。其中&#xff0c;赛维年代首日大涨115.11%&#xff0c;中一签约可赚1.2万元&#xff1b;昊帆生物、英华特、…

ShardingSphere项目实战集群环境准备

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

React06-简单实战案例

一、计时器 1. 案例场景 计时器在很多网站中都有使用&#xff0c;以时分秒的格式展示当前时间&#xff0c;每秒刷新一次。 2. 案例展示 展示的时间将随着系统时间&#xff0c;每秒刷新一次。 3. 案例代码 import { useState, useEffect } from react;export default func…

golang中的【数组】相关知识点

目录 数组含义数组定义形式数组的声明初始化方式数组变量的类型 arr的特征数组的遍历遍历的用法二数组的值传递数组的引用&取地址 传送二维数组的相关操作定义二维数组初始化遍历 Golang是一种高效的编程语言&#xff0c;具有很多特性和优点&#xff0c;其中之一就是其对数…

查看服务器GPU使用情况,以及使用GPU的用户

查看服务器GPU使用情况&#xff0c;以及使用GPU的用户 1.查看gpu使用情况 nvidia-smi2.查看是谁在占用gpu ps -f -p PID例如 ps -f -p 1986875就可以看到是谁在用了

谷歌发布ALBERT V2和中文模型

2019年9月推出时&#xff0c;谷歌的ALBERT语言模型在GLUE、RACE和SQuAD 2.0等流行的自然语言理解&#xff08;NLU&#xff09;基准上取得了SOTA结果。谷歌现在发布了一个主要的V2 ALBERT更新和开源的中国ALBERT模型。 正如全名“A Lite BERT”所示&#xff0c;ALBERT是该公司B…

组件的状态

组件的状态 react hook出来之前&#xff0c;函数式组件是没有自己状态的。 ​ jsx 就和原生js编写差不多&#xff0c;所有就当作在定义类&#xff0c;在类方法中使用变量&#xff0c;就要通过this来调用。 ​ 主义要写在state中&#xff0c;数据驱动视图&#xff0c;我们想要修…

Vite 3.0 核心盘点与分析

自2021 年2月&#xff0c;Vite 2.0版本发布以来&#xff0c;Vite项目在的用户量方面发生了非常迅速的增长&#xff0c;很快达到了每周 100 万的npm下载量&#xff0c;成为npm下载量最高的几个项目之一。同时&#xff0c;Vite 的社区也越来越活跃&#xff0c;目前已经形成非常庞…

如何用手机实现三维可视化

三维可视化是一种强大的工具&#xff0c;可以将复杂的数据、概念或场景以直观、具体的形式展现出来。它将数据或模型转化成三维图像&#xff0c;使人们能够更清晰地理解和分析其中的关系和特征。三维可视化不仅可以用于科学研究和工程设计&#xff0c;还广泛应用于教育、娱乐和…

linux内核调试工具记录

Linux性能测试使用的工具在github网站可见&#xff0c;网址如下&#xff1a; slides: http://www.slideshare.net/brendangregg/linux-performance-analysis-new-tools-and-old-secrets video: https://www.usenix.org/conference/lisa14/conference-program/presentation/greg…

在线考试系统源码搭建:springboot+mybatis+mysql+vue

下载源码 在线考试 刷题小程序 题库答题小程序 : 适用机构场景&#xff1a;在线考试系统适用于企业考核、员工职评测、培训机构考证刷题等场景&#xff1b;用户端功能&#xff1a;顺序练习&#xff0c;真题模拟&#xff0c;我的错题&#xff0c;我的收藏、错题重练(答对自动移…

【Atcoder】 [ARC156C] Tree and LCS

题目链接 Luogu方向 Atcoder方向 题目解法 手玩几个小数据之后可以猜测最小的最大相似度一定为1 考虑构造&#xff1a;每次找到2个叶子&#xff0c;交换权值&#xff0c;然后删掉&#xff08;最后如果剩下一个点权值不变&#xff09; 证明&#xff1a; 首先可以证明最大的相…

【微服务实战之Docker容器】第三章-镜像仓库

系列文章目录 【微服务实战之Docker容器】第一章-下载及安装 文章目录 系列文章目录Docker镜像提交本地镜像发布到阿里云阿里云镜像下载到本地使用本地镜像发布到私有库 Docker镜像提交 docker commit提交容器副本使之成为一个新的镜像docker commit -m“提交的描述信息” -a…