在进行图像处理的时候,有时需要将图像中的物体抠图出来,传统的做法可以使用PS、Excel等方法做。今天我们使用opencv代码的方式实现图像抠图。
用到的函数主要有:cv.inRange(src, lowerb, upperb)
,cv.bitwise_not()
,cv.bitwise_and()
。
cv.inRange(src, lowerb, upperb)
:函数的功能是根据像素的范围进行过滤,把符合像素范围的保留,赋值0,黑色;不符合的赋值255,白色。src
:需要处理的图像lowerb
:最小像数值upperb
:最大像素值cv.bitwise_not(),cv.bitwise_and()
这两个函数的说明。详见:图像位级运算
# -*-coding:utf-8-*-
"""
File Name: color_space_conversion.py
Program IDE: PyCharm
Create File By Author: Hong
"""
import cv2 as cv
import numpy as np
def image_matting(image_path: str):
img = cv.imread(image_path, cv.IMREAD_COLOR)
cv.imshow('input', img)
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
cv.imshow('hsv', hsv)
# 根据像素的范围进行过滤,把符合像素范围的保留,不符合的赋值0或者255
# 根据hsv颜色表找出最大值和最小值
mask = cv.inRange(hsv, (35, 43, 46), (77, 255, 255))
cv.imshow('cc', mask)
mask = cv.bitwise_not(mask)
# 只在mask区域做与运算
result = cv.bitwise_and(img, img, mask=mask)
cv.imshow('mask', mask)
cv.imshow('result', result)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == '__main__':
path = 'images/dog.jpg'
image_matting(path)