第三章-OpenCV基础-4-掩模

基本概念

掩模,又称为掩膜,掩码,模板。图像掩模是指,用特定的图像/图形/物体遮挡代处理的图像(全部或局部),从而控制图像处理的区域,在数字图像处理中,掩模就是一个指定的数组,毕竟,图像也是数组。

左边图为原图,中间图为掩模(白色区域为透明区域,黑色区域为黑色遮挡区域),经过控制处理后,得到右边的结果图。

乘法运算

乘法运算的基础是任何数与0相乘为0,任何数和1相乘为其本身

简单实操如下:

import cv2 as cv
import numpy as np

lena = cv.imread("lena.jpg")
shape = lena.shape
cv.imshow("lena", lena)
# 生成掩模区域
yanmo = np.zeros([shape[0], shape[1], shape[2]], np.uint8)
# 生成掩模实际作用区域
yanmo[100:300, 200:400] = 1
# 掩模乘法操作
new_lena = lena * yanmo
cv.imshow("new_lena", new_lena)

cv.waitKey()
cv.destroyAllWindows()

显示如下:

注意:

  1. 图像的shape属性是一个包含图片长、宽、通道数的元祖
  2. 生成的掩模和图像大小必须完全一致

逻辑运算

逻辑运算的基础是任何数与0进行按位与运算结果为0,任何数与1进行按位与运算为其本身,8位像素值的全1值为255。

因此如上代码可以改为:

import cv2 as cv
import numpy as np

lena = cv.imread("lena.jpg")
shape = lena.shape
print(type(shape))
cv.imshow("lena", lena)
# 生成掩模区域
yanmo = np.zeros([shape[0], shape[1], shape[2]], np.uint8)
# 生成掩模实际作用区域,全部为255
yanmo[100:300, 200:400] = 255
# 掩模按位与操作
new_lena = cv.bitwise_and(lena, yanmo)
cv.imshow("new_lena", new_lena)

cv.waitKey()
cv.destroyAllWindows()

效果如上图一样。

掩模作为函数参数

我们知道,掩模本质是一个特定的数组,掩模在函数中作为参数存在。

举例说明: 计算结果 = cv2.add( 参数1 , 参数2 ,掩模 )

当使用掩模参数时,操作只会在掩模数组中值为非空的像素点上执行,并将其他像素点的像素值置为0

具体使用如下代码:

import cv2 as cv
import numpy as np

lena = cv.imread("lena.jpg")
# 随便截的一张图,大小和lena的一样 512*512
test = cv.imread("test.png")
h, w, c = lena.shape
cv.imshow("lena", lena)
cv.imshow("test", test)
# 生成掩模区域
yanmo = np.zeros([h,w], np.uint8)
# 生成掩模实际作用区域,全部为非0即可,这里随便选了100
yanmo[0:400, 100:400] = 100
# 掩模作为函数参数使用
new_lena = cv.add(lena, test, mask=yanmo)
cv.imshow("mask", new_lena)

cv.waitKey()
cv.destroyAllWindows()

运行结果:

 

注意:

  1. 掩模作为函数参数实现时,只要数组位置的值为0,则这些位置都置为0
  2. 其他不为0的位置的数值,只要不为0即可

猜你喜欢

转载自blog.csdn.net/sunguanyong/article/details/129211559
今日推荐