Opencv 掩膜

Opencv 掩膜

使用HSV对imori.jpg进行掩膜处理,只让蓝色的地方变黑。

像这样通过使用黑白二值图像将对应于黑色部分的原始图像的像素改变为黑色的操作被称为掩膜。

要提取蓝色部分,请先创建这样的二进制图像,使得HSV色彩空间中180\leq H\leq 260的位置的像素值设为1,并将其0和1反转之后与原始图像相乘。

这使得可以在某种程度上将蝾螈(从背景上)分离出来。

python实现:

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.where((hsv > 180) & (hsv[0] < 260))] = 255

mask[np.logical_and((hsv[..., 0] > 180), (hsv[..., 0] < 260))] = 1

return mask

# masking

def masking(img, mask):

mask = 1 - 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("imori.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()

输入(imori.jpg):

掩码:

输出:

🎯 相关推荐

自媒体人的效率革命!小宾视频字幕生成器深度测评与使用指南​
【雷诺报价】雷诺4S店报价大全
365bet皇冠体

【雷诺报价】雷诺4S店报价大全

📅 07-10 👀 432
贪玩蓝月最强角色攻略 什么职业最强
bet5365入口

贪玩蓝月最强角色攻略 什么职业最强

📅 07-07 👀 6327