目录

1. 图像加法运算

(1)随机生成灰度图像

(2)读取原始图像

(3)两图像相加

(4)图像像素点加常数

2. 图像减法运算

(1)减小亮度

(2)还原添加灰度图像的图像

3. 图像与运算

4. 图像或运算

5. 图像异或运算

6. 图像非运算

7. 图像逻辑运算的意义

结束语


1. 图像加法运算

图像加法运算是将一幅图像加在另外一幅图像上面或者对图像的某一个像素点值进行操作,加上一个常数改变其亮度或者颜色

(1)随机生成灰度图像

参考资料:图像的像素加法、减法运算

import numpy as np
import cv2
#np.random.randint(a, b)生成大于等于 a 小于 b 的随机整数
img_gray = np.random.randint(0, 256, size=[406, 600], dtype=np.uint8)#生成一张 406*600 的随机灰度图
cv2.namedWindow("gray")
cv2.imshow("gray", img_gray)
cv2.waitKey(delay = 0)

(2)读取原始图像

首先是从电脑获得已经下载的图像:

import numpy as np
import cv2img1 = cv2.imread('E:\From Zhihu\For the desk\de.jpg') #读取图像
cv2.namedWindow("awindow")    #创建窗口
img1_1 = cv2.resize(img1, dsize= None, fx = 0.5, fy = 0.5)#对图像尺寸进行调整
cv2.imshow("awindow", img1_1)   #显示图像
cv2.waitKey(delay = 0)    #等待
print(img1_1.shape)   #读取图像信息

并得到图像的信息:

(406, 600, 3)  图像的分辨率以及通道,之前的灰度图像就是以这个图像的大小生成的

(3)两图像相加

使用 cv2.addWeighted() 函数

该函数包括参数:图像1,图像1权值,图像2,图像2权值,为合成后的图像像素值所加的数

使用该函数时,两图像分辨率必须一致,图像通道数也要一致

本例中是将上面的灰度图像和读取的图像相加得到的

主要实现方法如下,我已经添加了注释

"""
Author:XiaoMa
date:2021/10/15
"""
import numpy as np
import cv2img1 = cv2.imread('E:\From Zhihu\For the desk\de.jpg')  #读取图像
cv2.namedWindow("awindow") #创建窗口
img1_1 = cv2.resize(img1, dsize= None, fx = 0.5, fy = 0.5)#调整大小
img_gray0 = cv2.cvtColor(img1_1, cv2.COLOR_BGR2GRAY)          #对图像进行灰度处理
cv2.imshow("awindow", img_gray0)   #显示图像
cv2.waitKey(delay = 0) #等待img_gray = np.random.randint(0, 256, size=[406, 600], dtype=np.uint8)#生成随机灰度图
cv2.namedWindow("gray")
cv2.imshow("gray", img_gray)
print(img_gray.shape) #读取灰度图属性
cv2.waitKey(delay = 0)final_img = cv2.addWeighted(img_gray0, 0.8, img_gray, 0.2, 8) #将两个图相加
cv2.namedWindow("windowfinal")
cv2.imshow("windowfinal", final_img)
cv2.waitKey(delay = 0)

得到最终图像:

可以看出两种图像相加,但还是能分辨出美女,这是因为我们在相加时将美女的权值调为 0.8 ,所以整张图中主要显示的还是美女

如果将权值修改一下:

final_img = cv2.addWeighted(img_gray0, 0.5, img_gray, 0.5, 8)

让二者五五开,得到如下图像:

(4)图像像素点加常数

在前面的文章中提到过,图像的像素点值代表其亮度

在这里我们尝试给每一个像素点加上 50 并与原图对比

首先我们得创建一个和原图同等尺寸的矩阵

Mix = np.ones(img1_1.shape, dtype=np.uint8)*50 #生成一个单位矩阵并乘以50,单位矩阵维度和 img1_1 相同
Addimg = cv2.add(Mix, img1_1)   #给每一个像素点加50
cv2.namedWindow("Addimg")
cv2.imshow("Addimg", Addimg)
cv2.waitKey(delay = 0)

得到的图像如下:

2. 图像减法运算

(1)减小亮度

cv2.subtract() 函数可以实现图像之间的减法

下面我们还原上面得到的图像:

img1_2 = cv2.subtract(Addimg, Mix)  #在得到的图像中减去矩阵
cv2.namedWindow("subimg")
cv2.imshow("subimg", img1_2)
cv2.waitKey(delay = 0)

得到的效果如下:

可见最上面的图还原了中间的那一幅图像

(2)还原添加灰度图像的图像

在前面我们将灰度图像和原始图像相加得到一幅比较模糊的图像,这里我们尝试对它进行还原

img1_3 = cv2.subtract(final_img, img_gray)
cv2.namedWindow("subimg1")
cv2.imshow("subimg1", img1_3)
cv2.waitKey(delay = 0)

得到的最终图像如下(subimg1 窗口):

可以看出减去灰度图像得到的图像并没有将原图复原出来,这是因为我们之前将两图像进行相加是按照权值相加的,所以直接减去灰度图像会使整个图像亮度降低

3. 图像与运算

在图像的运算中参考的资料:openCV—Python(6)—— 图像算数与逻辑运算

img1_4 = cv2.bitwise_and(img_gray0, img_gray)  #对两种图像进行与操作
cv2.namedWindow("And")
cv2.imshow("And", img1_4)
cv2.waitKey(delay = 0)

得到的图像如下:

由于生成的灰度图像为单通道图像,所以需要将原图像转化为灰度图像才能相与,再读入一幅三通道的图像进行与操作:

代码大致如下:

"""
Author:XiaoMa
date:2021/10/15
"""
import numpy as np
import cv2img1 = cv2.imread('E:\From Zhihu\For the desk\de.jpg')
cv2.namedWindow("beauty0")
img1_1 = cv2.resize(img1, dsize= None, fx = 0.5, fy = 0.5)
cv2.imshow("beauty0", img1_1)
print(img1_1.shape)
cv2.waitKey(delay = 0)img1_5 = cv2.imread('E:\From Zhihu\For the desk\de1.jpg')
img1_50 = cv2.resize(img1_5, dsize= None, fx = 0.834, fy = 0.903) #调整大小和前一幅图像一致
cv2.namedWindow("beauty1")
cv2.imshow("beauty1", img1_50)
cv2.waitKey(delay = 0)
print(img1_50.shape)img1_51 = cv2.bitwise_and(img1_1, img1_50)
cv2.namedWindow("Add1")
cv2.imshow("Add1", img1_51)
cv2.waitKey(delay = 0)

得到的图像:

。。。。。离了个大谱!beauty0 和 beauty1 都没了

4. 图像或运算

操作方式和图像的与运算一样,只是函数的名称变了

img1_51 = cv2.bitwise_or(img1_1, img1_50) #对两图像进行或运算

得到的最终图像:

5. 图像异或运算

img1_51 = cv2.bitwise_xor(img1_1, img1_50) #对两图像进行异或操作

得到的图像如下:

6. 图像非运算

对一个图像进行非操作

img1_51 = cv2.bitwise_not(img1_1) #对读取的图像进行非操作
cv2.namedWindow("Not")
cv2.imshow("Not", img1_51)
cv2.waitKey(delay = 0)

7. 图像逻辑运算的意义

参考资料:知乎回答

图像处理-逻辑运算

首先简单的算术运算对于图像来说就是对像素点值进行处理,为一幅图像加上一些要素或者减去一些要素,来观察图像的变化或者不同

在逻辑运算中,与运算可以求出两图像相交的部分,即对应的像素如果同时为真时结果为真;

非运算主要是将黑变为白,将白变为黑,对灰度图像的处理十分有效;

或运算可以求两种图像的合并,一个像素点为真时结果为真;

异或运算当两像素点相同时结果为真,不同时结果为假,可以得到两种图像不相交的部分,可以将图像进行扣出或者其他操作。

结束语

这篇文章主要汇总了图像处理过程中的一些算数运算和逻辑运算,也简单介绍了它们的意义,主要涉及一些基础操作,为后面的学习打下基础;对于一些参考资料我也添加在文章中了,如果想深入了解可以点进去进行学习。

Python 计算机视觉(四)—— OpenCV进行图像算数与逻辑运算相关推荐

  1. openCV—Python(6)—— 图像算数与逻辑运算

    openCV-Python(6)-- 图像算数与逻辑运算 一.函数简介 1.add-图像矩阵相加 函数原型:add(src1, src2, dst=None, mask=None, dtype=Non ...

  2. python matplotlib 显示opencv的图像

    python matplotlib 显示opencv的图像 首先需要import import cv2 import numpy as np from matplotlib import pyplot ...

  3. python计算机视觉-- 基于OpenCV的图像分割和图像融合系统

    目录 前言 一.需求分析 二.概要设计 2.1 基本原理 2.2 界面设计 三.详细设计 3.1 系统流程图 3.2 数据集 3.3 代码实现 3.3.1 利用deeplabV3模型分割 3.3.2  ...

  4. OpenCV入门(C++/Python)-使用OpenCV裁剪图像(四)

    裁剪是为了从图像中删除所有不需要的物体或区域.甚至突出显示图像的特定功能. 使用OpenCV裁剪没有特定的功能,NumPy数组切片是工作.读取的每个图像都存储在2D数组中(对于每个颜色通道).只需指定 ...

  5. python计算机视觉编程——基本的图像操作和处理

    python计算机视觉编程--第一章(基本的图像操作和处理) 第1章 基本的图像操作和处理 1.1 PIL:Python图像处理类库 1.1.1 转换图像格式--save()函数 1.1.2 创建缩略 ...

  6. OpenCV入门(C++/Python)- 使用OpenCV标注图像(六)

    使用OpenCV标注图像 用颜色线标注图像 绘制圆 绘制实心圆 绘制矩阵 绘制椭圆 绘制带轮廓和填充半椭圆 使用文本注释图像 为图像和视频添加标注的目的不止一个,包含: 向视频中添加信息 在对象检测的 ...

  7. [Python图像识别] 四十六.图像预处理之图像去雾详解(ACE算法和暗通道先验去雾算法)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  8. 如何在 Python 中使用 OpenCV 在图像上添加水印

    简介 水印是企业和在线内容信用标记的重要组成部分.它可以以标志.签名或印章的形式出现,对创作者来说是独一无二的.在向数字世界中的对象创建者提供所有权或信用时,它是一个非常重要的工具. 大多数专业人士使 ...

  9. Python计算机视觉:第八章 图像类容分类

    第八章 图像类容分类 8.1 K最近邻 8.1.1 一个简单的二维例子 8.1.2 图像稠密(dense)sift特征) 8.1.3 图像分类--手势识别 8.1 session 和登录失败 8.1. ...

最新文章

  1. 安全专家十年磨一剑的独门秘笈,威力堪比《九阴真经》
  2. linux sftp远程连接命令
  3. java核心编程视频教学
  4. java super父类的父类_合理使用父类的财富——Java中的super
  5. 常考数据结构与算法:单链表的排序
  6. 连麦互动直播方案全实践2:网易云信连麦互动直播方案的演变过程
  7. 【开源项目之路】jquery的build问题
  8. 04简单线性回归实战
  9. java 反射基础知识
  10. plsql developer 查看存储过程执行计划_产品简介 | X-Developer一站式研发效能管理平台...
  11. mybatis一个方法执行多条sql_精尽MyBatis源码分析——SQL执行过程之Executor!
  12. FPGA图像处理 两路sensor的色调不一致
  13. 知乎7万赞回答:你思考问题的方式,决定了你的层次
  14. 【预训练语言模型】MacBERT: Revisiting Pre-trained Models for Chinese Natural Language Processing
  15. STM32开发环境安装
  16. esp32运行linux,ubuntu系统搭建ESP32 开发环境
  17. 为什么要去做亚马逊僵尸跟卖呢 亲身经历告诉你
  18. (转载)SPSS之聚类分析(图文+数据集)
  19. python——计时器,走马灯
  20. R语言-岭回归的代码与案例解读

热门文章

  1. ALV设置参考表和参考字段,自定义列名称可能失效
  2. 网银和银企直联的区别
  3. sap开发-采购订单更改历史table
  4. 小鸭脖大生意——绝味鸭脖背后的故事
  5. 电商ERP vs.传统ERP,有何不一样?
  6. 2020最后一个月,近4成应届生未就业,19个头部城市谁最留不住人?
  7. 从国考大数据看中国哪个省的人最爱当官
  8. java 监听队列_spring+activemq实战之配置监听多队列实现不同队列消息消费
  9. kali启动cobaltstrike_Cobalt Strike MetaSploit 联动
  10. 父亲节用计算机给惊喜,2015父亲节的惊喜作文:给爸爸特殊的礼物