600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Python OpenCV 图像处理之 图像运算和图像位运算知识补充

Python OpenCV 图像处理之 图像运算和图像位运算知识补充

时间:2020-03-03 03:12:51

相关推荐

Python OpenCV 图像处理之 图像运算和图像位运算知识补充

Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。本篇博客是这个系列的第 51 篇。

该系列文章导航参考:/hihell/category_10688961.html

Python OpenCV

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

学在前面

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

图像加法

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

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

import cv2 as cvimport 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 cvimport numpy as npsrc1 = cv.imread("./51.jpg", 0)src2 = cv.imread("./51.jpg", 0)src = src1+src2cv.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 cvimport numpy as npsrc1 = np.ones((3, 3), dtype=np.uint8) * 100src2 = 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 cvimport 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。

bitwise_and对应的函数原型是:

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

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

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

import cv2 as cvimport 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。

按位取反语按位异或

按位取反,计算方式是 1 变成 0,0 变成 1。

按位异或操作,计算方式是二进制位如果对应都是 0 或者 1,那结果是 0,对应位置有一个 1,一个 0,结果是 1。

后面的了解即可。

图像与数值的计算

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

import cv2 as cvimport numpy as npsrc = np.ones((3, 3), dtype=np.uint8)*5print("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 个小时你有所收获,我们下篇博客见~

相关阅读

技术专栏

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

今天是持续写作的第 95 / 100 天。

如果你想跟博主建立亲密关系,可以关注同名公众号 梦想橡皮擦,近距离接触一个逗趣的互联网高级网虫。

博主 ID:梦想橡皮擦,希望大家点赞、评论、收藏。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。