【OpenCV】112 KMeans图像分割—背景替换

112 KMeans图像分割—背景替换

代码

import numpy as np
import cv2 as cv

image = cv.imread('../images/toux.jpg')
cv.imshow("input", image)
h, w ,ch = image.shape
# 构建图像数据
data = image.reshape((-1,3))
data = np.float32(data)

# 图像分割
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 10, 1.0)
num_clusters = 4
ret,label,center=cv.kmeans(data, num_clusters, None, criteria, num_clusters, cv.KMEANS_RANDOM_CENTERS)

# 生成mask区域
index = label[0][0]
center = np.uint8(center)
color = center[0]
mask = np.zeros((h, w), dtype=np.uint8)
label = np.reshape(label, (h, w))
mask[label == index] = 255

# 高斯模糊
se = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
cv.dilate(mask, se, mask)
mask = cv.GaussianBlur(mask, (5, 5), 0)
cv.imshow('background-mask',mask)

# blend image
result = np.zeros((h, w, ch), dtype=np.uint8)
for row in range(h):
    for col in range(w):
        w1 = mask[row, col] / 255.0
        b, g, r = image[row, col]
        b = w1 * 255.0 + b * (1.0 - w1)
        g = w1 * 0 + g * (1.0 - w1)
        r = w1 * 255 + r * (1.0 - w1)
        result[row, col] = (b, g, r)
cv.imshow("background substitution", result)

cv.waitKey(0)
cv.destroyAllWindows()

实验结果

在这里插入图片描述

解释

KMeans可以实现简单的证件照片的背景分割提取与替换,大致可以分为如下几步实现

  1. 读入图像建立KMenas样本
  2. 使用KMeans图像分割,指定指定分类数目
  3. 取左上角的label得到背景cluster index
  4. 生成mask区域,然后高斯模糊进行背景替换

所有内容均来源于贾志刚老师的知识星球——OpenCV研习社,本文为个人整理学习,已获得贾老师授权,有兴趣、有能力的可以加入贾老师的知识星球进行深入学习。
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV中,Kmeans聚类算法可以用于图像分割。该算法可以将图像像素分成不同的聚类,每个聚类代表了相似的像素颜色。这样可以将图像分成不同的区域,以便进行进一步的处理。要实现Kmeans聚类图像分割,您需要配置OpenCV340版本,其他版本可能需要更改属性表。 另外,如果您想要学习更多关于OpenCV的知识,可以参考NVIDIA GPU系列技术文档中的CUDA编程入门教程。此教程包含有关接口的详细使用指南和编程案例,以及有关OpenCV和PyTorch的教程。 此外,还有一种基于无监督学习的方法来实现图像分类和聚类。这种方法使用SIFT算法提取图像特征,然后使用KMeans聚类算法进行图像分类。通过优化源代码,可以实现将对应的图像自动分类到各自的文件夹,并优化分类准确率。该方法的设计思路包括编写代码来提取图像特征、使用KMeans算法进行聚类,并将图像分类到不同的文件夹中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++结合OpenCV实现Kmeans聚类图像分割的案列](https://download.csdn.net/download/qq_41828351/11012346)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [NVIDIA CUDA编程指南/opencv教程/pytorch教程(中文版)](https://download.csdn.net/download/m0_73878864/88265083)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [人工智能_项目实践_图像聚类_使用SIFT算法提取图像特征,再使用KMeans聚类算法进行图像分类](https://download.csdn.net/download/admin_maxin/85024876)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值