Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。本篇博客是这个系列的第 51 篇。
该系列文章导航参考:https://blog.csdn.net/hihell/category_10688961.html

Python OpenCV

  • 学在前面
  • 图像加法
  • 图像加权和
  • 按位逻辑运算
    • 按位与
    • 按位或
    • 按位取反语按位异或
  • 图像与数值的计算
  • 橡皮擦的小节

学在前面

第二次学习图像相关的运算操作了,希望你可以学到新的知识,俺也一样。

图像加法

图像处理中的加法运算,可以使用运算符 +,也可以使用 cv.add 函数。

补充的第一个知识点,就是在灰度图中,两种图像加法运算存在差异。

import cv2 as cv
import numpy as npsrc1 = np.random.randint(0, 256, size=[3, 3], dtype=np.uint8)
src2 = np.random.randint(0, 256, size=[3, 3], dtype=np.uint8)print("src1 像素如下")
print(src1)print("src2 像素如下")
print(src2)print("src1 + src2 像素如下")
print(src1+src2)

使用 +cv.add 函数得到的结果如下:

src1 像素如下
[[ 27 119  55][ 84  41 192][140 167 153]]
src2 像素如下
[[ 97  19 184][218 229 146][160  67 221]]
src1 + src2 像素如下
[[124 138 239][ 46  14  82][ 44 234 118]]
使用 cv.add 函数结果如下
[[124 138 239][255 255 255][255 234 255]]

对比之后,很容易发现差异,使用运算符 + 进行计算,140+160 = 300(对应位置灰度值相加),但是结果为 44,该值是 300 对 256 取的余数,所以结论是运算符 + 进行计算之后,最终得到的像素值如果大于 255 ,则要对 256 进行取模操作,对应的使用 cv.add 函数之后,结果保留最大值 255。
针对灰度图片,可以执行下述代码,查看二者差异。

import cv2 as cv
import numpy as npsrc1 = cv.imread("./51.jpg", 0)
src2 = cv.imread("./51.jpg", 0)src = src1+src2
cv.imshow("src1+src2", src)src = cv.add(src1, src2)
cv.imshow("cv.add(src1, src2) ", src)cv.waitKey()
cv.destroyAllWindows()

图像加权和

在计算两幅图像的像素之和的时候,可以考虑到权重因素。由以前的博客知道,该函数原型是:

dst = cv2.addWeighted(src1,alpha,src2,beta,gamma)

其中 alphabetasrc1src2 的系数,它们的和可以等于 1,也可以不等于,参数 gamma 一般为 0,表示的是亮度调节,最终得到的图像是 dst = src1 x alpha + src2 x beta +gamma

使用下述案例,可以简单了解该函数的运行原理与结果。

import cv2 as cv
import numpy as npsrc1 = np.ones((3, 3), dtype=np.uint8) * 100
src2 = np.ones((3, 3), dtype=np.uint8) * 10gamma = 5src3 = cv.addWeighted(src1, 0.6, src2, 0.4, gamma)
print(src1)
print(src2)
print(src3)

运行之后得到的结果如下:

[[100 100 100][100 100 100][100 100 100]]
[[10 10 10][10 10 10][10 10 10]]
[[69 69 69][69 69 69][69 69 69]]

灰度值 69 由 100*0.6+10*0.4+5 得来。
实际对两幅灰度图进行操作,可以得到如下结果:

import cv2 as cv
import numpy as npsrc1 = cv.imread("./src1.jpg", 0)
src2 = cv.imread("./src2.jpg", 0)ret = cv.addWeighted(src1, 0.5, src2, 0.5, 0)
cv.imshow("ret", ret)
cv.waitKey()
cv.destroyAllWindows()

按位逻辑运算

在图像处理中,常见的位运算函数如下;

  • cv.bitwise_and:按位与;
  • cv.bitwise_or:按位或;
  • cv.bitwise_xor:按位异或;
  • cv.bitwise_not:按位取反。

按位与

位运算操作的是二进制数字,在无符号 8 位图像里面,按位与操作需要对应位置为 1 结果才为 1,否则都为 0。

十进制灰度值 二进制灰度值
src1 100 01100100
src2 200 11001000
按位与运算结果 64 01000000


bitwise_and 对应的函数原型是:

dst = cv.bitwise_and(src1,src2[,mask])

src1src2 都是输入值,mask 是掩膜,任何数值与 0 进行按位与操作,都会得到 0,任何数值与 255 进行按位与操作,都会得到数值本身,上述数值都是 8 位无符号数字。

可以通过生成一张灰度图进行测试。

import cv2 as cv
import numpy as npgray_src = np.random.randint(0, 255, (7, 7), dtype=np.uint8)
black_src = np.zeros((7, 7), dtype=np.uint8)
black_src[3:7, 3:7] = 255dst = cv.bitwise_and(gray_src, black_src)
print("gray_src")
print(gray_src)print("black_src")
print(black_src)print("dst")
print(dst)

运行结果如下,注意右下角数值进行计算之后,得到的结果是原值。

gray_src
[[163 207 197  64  54 181  28][ 14 145 190  70  99  25  38][ 44 221 109 115 229 222 200][223  51 222 114 204  46  90][216  98  47  47 151  15 196][ 73  59 187 100 123  56  38][177 105 237   8 129  64  30]]
black_src
[[  0   0   0   0   0   0   0][  0   0   0   0   0   0   0][  0   0   0   0   0   0   0][  0   0   0 255 255 255 255][  0   0   0 255 255 255 255][  0   0   0 255 255 255 255][  0   0   0 255 255 255 255]]
dst
[[  0   0   0   0   0   0   0][  0   0   0   0   0   0   0][  0   0   0   0   0   0   0][  0   0   0 114 204  46  90][  0   0   0  47 151  15 196][  0   0   0 100 123  56  38][  0   0   0   8 129  64  30]]

循着这个案例,你可以实现对一副图像进行掩膜操作。

按位或

按位或与按位与用法基本一致,就是在进行二进制计算的时候,对应位有一个是 1,结果就是 1。

十进制灰度值 二进制灰度值
src1 100 01100100
src2 200 11001000
按位或运算结果 236 11101100

按位取反语按位异或

按位取反,计算方式是 1 变成 0,0 变成 1。
按位异或操作,计算方式是二进制位如果对应都是 0 或者 1,那结果是 0,对应位置有一个 1,一个 0,结果是 1。
后面的了解即可。

图像与数值的计算

在图像处理的加法运算中,cv.add 函数可以将图像与一个数值进行计算,例如下述代码:

import cv2 as cv
import numpy as npsrc = np.ones((3, 3), dtype=np.uint8)*5
print("src")
print(src)dst = cv.add(src, 5)
dst1 = cv.add(5, src)
print("dst")
print(dst)print("dst1")
print(dst1)

运算结果如下,得到了最后的效果,而且交换两个参数的位置,不影响最后的结果。

src
[[5 5 5][5 5 5][5 5 5]]
dst
[[10 10 10][10 10 10][10 10 10]]
dst1
[[10 10 10][10 10 10][10 10 10]]

橡皮擦的小节

希望今天的 1 个小时你有所收获,我们下篇博客见~

相关阅读


技术专栏

  1. Python 爬虫 100 例教程,超棒的爬虫教程,立即订阅吧
  2. Python 爬虫小课,精彩 9 讲

今天是持续写作的第 95 / 100 天。
如果你想跟博主建立亲密关系,可以关注同名公众号 梦想橡皮擦,近距离接触一个逗趣的互联网高级网虫。
博主 ID:梦想橡皮擦,希望大家点赞、评论、收藏。

Python OpenCV 图像处理之 图像运算和图像位运算知识补充相关推荐

  1. Python+OpenCV 图像处理系列(9)—— 图像的翻转和缩放插值

    1. 图像的翻转 图像翻转 (Image Flip),图像翻转的本质像素映射,OpenCV 支持三种图像翻转方式: X轴翻转,flipcode = 0 Y轴翻转, flipcode = 1 XY轴翻转 ...

  2. Python+OpenCV 图像处理系列(5)—— 图像 ROI 操作及通道的拆分合并

    1. 图像 ROI 有时你需要对一幅图像的特定区域进行操作.例如我们要检测一副图像中眼睛的位置,我们首先应该在图像中找到脸,再在脸的区域中找眼睛,而不是直接在一幅图像中搜索.这样会提高程序的准确性和性 ...

  3. Python+OpenCV 图像处理系列(4)—— 图像像素的读写、算术运算、逻辑运算及像素的统计

    1. 像素的读写 可以根据像素的行和列的坐标获取它的像素值.对 BGR 图像而言,返回值为 B,G,R 的值. img.shape 可以获取图像的形状.它的返回值是一个包含行数 h,列数 w,通道数 ...

  4. Python+OpenCV 图像处理系列(7)—— 图像色彩空间及转换

    1. 色彩空间转换函数 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 第一个参数为加载在内存的读片,第二个参数为转换的类型,其中包括: COLOR_BGR2GRAY = ...

  5. Python OpenCV图像处理:❤️转换+梯度❤️边缘检测+图像融合,aplacian金字塔合成新物种

  6. Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图

    一步一步来吧 上一节:Python+Opencv图像处理新手入门教程(一):介绍,安装与起步 1.什么是图像 对于计算机而言,图像的本质是一个由像素点构成的矩阵. 例如我们用肉眼很容易分辨一辆汽车的后 ...

  7. Python+OpenCV图像处理(五)——图像阈值和二值化

    系列文章 Python+OpenCV图像处理(一)--OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)--几何变换 Python+OpenCV图像处理(三)--彩色空间互换 P ...

  8. Python+OpenCV图像处理(一篇全)

    参考:1.网易云课堂 Python+OpenCV图像处理 - 网易云课堂 2.[在水一方xym的博客]业精于勤荒于嬉,行成于思毁于随 - CSDN博客 https://blog.csdn.net/za ...

  9. Python OpenCV图像处理 理论 代码

    python opencv图像处理 GitHub - LeBron-Jian/ComputerVisionPractice OpenCV计算机视觉学习 & 代码 OpenCV计算机视觉学习(1 ...

  10. Python+Opencv图像处理新手入门教程(四):视频内容的读取与导出

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(三):阈值与二值化 1.Intro 今天这节我们主要看怎么利用opencv读取并处理视频中的内容. 2.VideoCapture ...

最新文章

  1. 十步完全理解 SQL
  2. Linux服务源码安装后开机自启动04-php-fpm
  3. 怎么把本地的文件传给服务器,怎么把本地文件传给云服务器
  4. rsync远程数据同步工具的使用
  5. CentOS 6.3安装Nginx开启目录浏览、下载功能
  6. linux内核镜像解压,解压内核镜像
  7. 直接销毁_战机报废,发动机怎么处理?美国直接销毁,中国改造成扫雪神器
  8. 用python写helloworld_Python Helloworld程序简单实现
  9. hog函数的用法 python_Python常见内置函数用法(三)
  10. C/C++ OpenCV均值滤波
  11. 简单的Site to site ipsec ×××实验
  12. SQLServer2008将表数据导出的方法
  13. 快速浏览Silverlight3 beta:鸡肋一样的WritableBitmap
  14. 京东快递 单号查询接口 C# .net
  15. 7.JUC 三大辅助类
  16. OAuth 2.0 授权认证详解
  17. 第1章 Dev C++的使用
  18. 六步绘制漂亮思维导图简单画法
  19. 道不投不足与谋:(,决定放弃原来的博客空间,不再更新
  20. ArcBlock 分享 | 在国外,没有中国人参与的项目就不投

热门文章

  1. socket网络编程套接字TCP/UDP两种方式详解
  2. 一个快乐网管的经验谈,教你怎样做快乐网管(转)
  3. APP自动化定位方法
  4. flac3d6.0教程 附安装教程
  5. 光固化3D打印机切片参数分析
  6. STM32输出PWM信号(库函数版本)
  7. 计算机在电气中的应用,阐释计算机技术在电力系统中的应用
  8. Owl Carousel轮播插件介绍
  9. Spark Hadoop 环境搭建http://www.jianshu.com/p/5b1eafdf34a9
  10. 第一章 车联网技术的背景、发展和各国地区的现状