目录
阈值处理小结
图像的运算
掩模
图像的加法运算
图像的位运算
按位与运算
按位或运算
按位取反运算
按位异或运算
加权和
覆盖
阈值处理小结
OpenCV 提供了一个可以快速抠出图像主体线条的工具,这个工具就是阈值。在阈值的作用下,一幅彩色图像被转换为只有纯黑和纯白的二值图像。然而,灰度图像经 6(自适应阈值处理包括在其中) 种阈值处理类型处理后,都无法得到图像主体的线条。为此,OpenCV 提供了一种改进的阈值处理技术,即自适应处理,其关键在于对图像中的不同区域使用不同的阈值。有了这种改进的阈值处理技术,得到图像主体的线条就不再是一件难以实现的事情了。
图像是由像素组成的,像素又是由具体的正整数表示的,因此图像也可以进行一系列数学运算,通过运算可以获得截取、合并图像等效果。OpenCV 提供了很多图像运算方法,经过运算的图像可以呈现出很多有趣的视觉效果。下面将对 OpenCV 中一些常用的图像运算方法进行介绍。
可以类比于做手术时的那块手术布,有一块手术区域,而掩模就是图像处理的手术区域
掩模,也叫作掩码,英文为 mask,在程序中用二值图像来表示:0 值(纯黑)区域表示被遮盖的部分,255 值(纯白)区域表示暴露的部分(某些场景下也会用 0 和 1 当作掩模的值)。
255值得那部分 就是被操作得那部分
创建 3 通道掩模图像
利用 numpy 库的 zeros()方法创建一幅掩模图像,感兴趣区域为在该图像中横坐标为 20、纵坐标为 50、宽为 60、高为 50 的矩形,展示该掩模图像。调换该掩模图像的感兴趣区域和不感兴趣区域之后,再次展示掩模图像,具体代码如下:
import cv2
import numpy as np
mask=np.zeros((150,150,3),np.uint8)
mask[50:100,20:80]=255
cv2.imshow('mask1',mask)
mask[:,:]=255
mask[50:100,20:80]=0
cv2.imshow('mask2',mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像中每一个像素都有用整数表示的像素值,2 幅图像相加就是让相同位置像素值相加,最后将计算结果按照原位置重新组成一幅新图像。原理如图 9.9 所示。
在开发程序时通常不会使用「+」运算符对图像做加法运算,而是用 OpenCV 提供的 add()方法,该方法的语法如下:
dst = cv2.add(src1, src2, mask, dtype)
位运算是二进制数特有的运算操作。图像由像素组成,每个像素可以用十进制整数表示,十进制整数又可以转化为二进制数,所以图像也可以做位运算,并且位运算是图像数字化技术中一项重要的运算操作。
与运算就是按照二进制位进行判断,如果同一位的数字都是 1,则运算结果的相同位数字取 1,否则取 0。
OpenCV 提供 bitwise_and()方法来对图像做与运算,该方法的语法如下:
dst = cv2.bitwise_and(src1, src2, mask)
图像做与运算时,会把每一个像素值都转为二进制数,然后让两幅图像相同位置的两个像素值做与运算,最后把运算结果保存在新图像的相同位置上
与运算有两个特点
1.如果和纯白就行与运算就是像素的原值
2.如果和纯黑进行运算就是纯黑值
或运算也是按照二进制位进行判断,如果同一位的数字都是 0,则运算结果的相同位数字取 0,否则取 1。
OpenCV 提供 bitwise_or()方法来对图像做或运算,该方法的语法如下:
dst = cv2.bitwise_or(src1, src2, mask)
或运算有以下两个特点
1.与纯白值运算就是纯白值
2.与纯黑值进行运算 变为原值
取反运算是一种单目运算,仅需一个数字参与运算就可以得出结果。取反运算也是按照二进制位进行判断,如果运算数某位上数字是 0,则运算结果的相同位的数字就取 1,如果这一位的数字是 1,则运算结果的相同位的数字就取 0。
异或运算也是按照二进制位进行判断,如果两个运算数同一位上的数字相同,则运算结果的相同位数字取 0,否则取 1。
OpenCV 提供 bitwise_xor()方法对图像做异或运算,该方法的语法如下:
dst = cv2.bitwise_xor(src, mask)
多次曝光技术是指在一幅胶片上拍摄几个影像,最后冲印出的相片同时具有多个影像的信息。
OpenCV 通过计算加权和的方式,按照不同的权重取两幅图像的像素之和,最后组成新图像。加权和不会像纯加法运算那样让图像丢失信息,而是在尽量保留原有图像信息的基础上把两幅图像融合到一起。
OpenCV 通过 addWeighted()方法计算图像的加权和,该方法语法如下:
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)
import cv2
import numpy as np
dog=cv2.imread('dog/gou .jpg')
car=cv2.imread('dog/img.png')
rows,cols,channel=dog.shape
car=cv2.resize(car,(cols,rows))
img=cv2.addWeighted(dog,0.6,car,0.6,0)
cv2.imshow('dog',dog)
cv2.imshow('car',car)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
覆盖图像就是直接把前景图像显示在背景图像中,前景图像挡住背景图像。覆盖之后背景图像会丢失信息,不会出现加权和那样的「多次曝光」效果。
OpenCV 没有提供覆盖操作的方法,开发者可以直接用修改图像像素值的方式实现图像的覆盖、拼接效果:从 A 图像中取像素值,直接赋值给 B 图像的像素,这样就能在 B 图像中看到 A 图像的信息了。
小结
读者朋友要明确关于掩模的 3 个问题:0 和 255 这 2 个值在掩模中各自发挥的作用;通过这 2 个值,掩模的作用又是什么;如何创建一个掩模。掌握了掩模后,就能够利用掩模遮盖图像相加后的结果。掩模除了应用于图像的加法运算外,还应用于图像的位运算。一个掩模应用于图像的位运算的典型实例就是对图像进行加密、解密。本章除了上述内容,还讲解了合并图像的 2 种方式:加权和、覆盖。读者朋友要熟练掌握这两种方式