imgOri = cv2.imread("../images/lady983Green.jpg")
height, width, channels = imgOri.shape
imgGray = cv2.cvtColor(imgOri, cv2.COLOR_BGR2GRAY)
imgGreen = imgOri[:,:,1]
print(imgOri.shape, imgGray.shape, imgGreen.shape)
hsv = cv2.cvtColor(imgOri, cv2.COLOR_BGR2HSV)
lowerColor = np.array([35, 43, 46])
upperColor = np.array([77, 255, 255])
binary = cv2.inRange(hsv, lowerColor, upperColor)
binaryInv = cv2.bitwise_not(binary)
imgMatte = cv2.bitwise_and(imgOri, imgOri, mask=binaryInv)
imgReplace = imgOri.copy()
imgReplace[binaryInv==0] = [0,0,255]
plt.figure(figsize=(12,8))
plt.subplot(231), plt.imshow(cv2.cvtColor(imgOri, cv2.COLOR_BGR2RGB)), plt.title("Origin image"), plt.axis('off')
plt.subplot(232), plt.imshow(imgGray, cmap='gray'), plt.title("Gray image"), plt.axis('off')
plt.subplot(233), plt.imshow(imgGreen, cmap='gray'), plt.title("Green channel level"), plt.axis('off')
plt.subplot(234), plt.imshow(binaryInv, cmap='gray'), plt.title("inv-binary mask"), plt.axis('off')
plt.subplot(235), plt.imshow(cv2.cvtColor(imgMatte, cv2.COLOR_BGR2RGB)), plt.title("Matting Image"), plt.axis('off')
plt.subplot(236), plt.imshow(cv2.cvtColor(imgReplace, cv2.COLOR_BGR2RGB)), plt.title("BgColor changed"), plt.axis('off')
plt.tight_layout()
使用自适应阈值方法对单色背景图像抠图的结果如图3.6所示。
对于确定颜色背景的蓝屏抠图,基于色彩范围的阈值抠图取得了非常满意的效果,对人像的头发丝都可以进行很好的分割,其性能优于固定阈值和自适应阈值方法。
图3.6 色彩范围抠图法
【本节完】
版权声明:
欢迎关注『Python 小白的项目实战 @ youcans』 原创作品
原创作品,转载必须标注原文链接:https://blog.csdn.net/youcans/article/details/122296231
Crated:2022-01-05
欢迎关注『Python 小白的项目实战 @ youcans』 原创作品
Python 小白的课题报告—OpenCV 抠图项目实战(1)目录摘要
Python 小白的课题报告—OpenCV 抠图项目实战(2)抠图绪论
Python 小白的课题报告—OpenCV 抠图项目实战(3)抠图综述
Python 小白的课题报告—OpenCV 抠图项目实战(4)固定阈值抠图
Python 小白的课题报告—OpenCV 抠图项目实战(5)自适应阈值抠图
Python 小白的课题报告—OpenCV 抠图项目实战(6)色彩范围抠图
Python 小白的课题报告—OpenCV 抠图项目实战(7)边缘检测
Python 小白的课题报告—OpenCV 抠图项目实战(8)图像轮廓
Python 小白的课题报告—OpenCV 抠图项目实战(9)评价指标
Python 小白的课题报告—OpenCV 抠图项目实战(10)PyQt5 使用
Python 小白的课题报告—OpenCV 抠图项目实战(11)算法实验平台
Python 小白的课题报告—OpenCV 抠图项目实战(12)源程序代码
通常,即使对于确定颜色背景的蓝屏抠图,背景图像的所有像素的颜色也并非完全相同,而是处于相近的色彩范围内。因此,对背景色彩范围进行阈值处理,比阈值处理更为合理。RGB 通道不能很好地反映出物体具体的颜色信息,而 HSV 空间可以非常直观的表达色彩的明暗、色调及鲜艳程度。因此,通常使用 HSV 色彩空间进行某种颜色的识别和不同颜色的对比。
HSV 模型在对指定颜色分割时非常有效。用 H 和 S 分量表示颜色距离,颜色距离指代表两种颜色之间的数值差异。对于不同的彩色区域,混合 H 与 S 变量,划定阈值,就可以进行简单的分割。
函数 inRange () 可以实现按颜色区域 [lowerb,upperb] 对图像进行二值分割 。
............
皮肤检测与抠图
皮肤检测的方法很多,这里写的是最简单的方法,感兴趣的同学可以自己加上椭圆检测,膨胀腐蚀等,使得检测与抠图更加精确。github上许多人脸识别的算法,可以多学习那些。
HSV颜色空间
hsv涉及心理学的颜色知识,比rgb检测具有更好的分类效果
python 代码
def get_skin_hsv(img)
hsv_img = cv2.cvtColor(img, cv2.COLOR_...
Java OpenCV是针对Java开发的一个开源计算机视觉库。它提供了许多处理图像和视频的功能,包括图像抠图。
图像抠图是指从原始图像中提取出感兴趣的对象或者将对象从背景中分离出来。在Java OpenCV中,可以使用GrabCut算法实现图像的抠图操作。
首先,我们需要加载原始图像并创建一个和原始图像一样大小的掩码图像。然后,需要通过绘制一个矩形来指定要抠图的对象的初始位置。接下来,可以使用GrabCut算法对图像进行迭代处理,将对象和背景逐渐分离。
在每次迭代中,我们需要指定一个矩形来更新掩码图像,标记哪些像素属于前景、背景或者未知区域。然后,根据模型的训练结果,可以通过对像素进行分类来更新掩码图像。最终,可以通过将不属于前景的像素设置为背景来得到最终的抠图结果。
在Java OpenCV中,可以使用Mat类来表示图像和掩码图像,使用Imgcodecs类加载和保存图像,使用Imgproc类实现图像处理操作,使用Rect类表示矩形区域。可以通过调用Imgproc.grabCut()方法来执行GrabCut算法。
总之,使用Java OpenCV可以实现图像的抠图操作,具体步骤包括加载原始图像、创建掩码图像、指定初始位置、迭代更新掩码图像,并最终得到抠图结果。通过这些步骤,可以实现在Java环境中方便地进行图像抠图的应用开发。