掩膜:通過使用黑白二值圖像 X 原圖像,使二值圖像黑色部分對應的原圖像中的部分變成黑色,其它部分不變,從而提取出原圖像中感興趣部分。
使用掩膜可以提取原圖像中的特定圖像,數字圖像處理中,掩模爲二維矩陣數組,有時也用多值圖像。
圖像掩模主要用於:
- 提取感興趣區,用預先製作的感興趣區掩模與待處理圖像相乘,得到感興趣區圖像,感興趣區內圖像值保持不變,而區外圖像值都爲0。
- 屏蔽作用,用掩模對圖像上某些區域作屏蔽,使其不參加處理或不參加處理參數的計算,或僅對屏蔽區作處理或統計。
- 結構特徵提取,用相似性變量或圖像匹配方法檢測和提取圖像中與掩模相似的結構特徵。
- 特殊形狀圖像的製作。
掩膜簡單實驗,比如,在我的上一篇文章中
圖像色彩追蹤
我已經提取到了圖像中藍色對應的部分,我可以將藍色部分設置爲1,其它部分設置爲0,這樣提取圖像藍色部分的掩膜就做了出來,然後和原圖像相乘,我就得到了圖像中的藍色部分。
實驗源碼
import cv2
import numpy as np
import matplotlib.pyplot as plt
# BGR -> HSV
def BGR2HSV(_img):
img = _img.copy() / 255.
hsv = np.zeros_like(img, dtype=np.float32)
# get max and min
max_v = np.max(img, axis=2).copy()
min_v = np.min(img, axis=2).copy()
min_arg = np.argmin(img, axis=2)
# H
hsv[..., 0][np.where(max_v == min_v)]= 0
## if min == B
ind = np.where(min_arg == 0)
hsv[..., 0][ind] = 60 * (img[..., 1][ind] - img[..., 2][ind]) / (max_v[ind] - min_v[ind]) + 60
## if min == R
ind = np.where(min_arg == 2)
hsv[..., 0][ind] = 60 * (img[..., 0][ind] - img[..., 1][ind]) / (max_v[ind] - min_v[ind]) + 180
## if min == G
ind = np.where(min_arg == 1)
hsv[..., 0][ind] = 60 * (img[..., 2][ind] - img[..., 0][ind]) / (max_v[ind] - min_v[ind]) + 300
# S
hsv[..., 1] = max_v.copy() - min_v.copy()
# V
hsv[..., 2] = max_v.copy()
return hsv
# make mask
def get_mask(hsv):
# 藍膜
mask = np.zeros_like(hsv[..., 0])
mask[np.logical_and((hsv[..., 0] > 180), (hsv[..., 0] < 260))] = 1
return mask
# masking
def masking(img, mask):
out = img.copy()
# mask [h, w] -> [h, w, channel]
mask = np.tile(mask, [3, 1, 1]).transpose([1, 2, 0])
out *= mask
return out
# Read image
img = cv2.imread("../lantian.jpg").astype(np.float32)
# RGB > HSV
hsv = BGR2HSV(img / 255.)
# color tracking
mask = get_mask(hsv)
# masking
out = masking(img, mask)
out = out.astype(np.uint8)
# Save result
cv2.imwrite("out.jpg", out)
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.destroyAllWindows()
實驗結果: