【图像分割】实战篇(1)传统图像分割

news/2024/12/2 11:28:38/

聚类图像分割

K均值聚类是一种常用的聚类算法,它将图像像素分为K个不同的群集,以使每个群集内的像素具有相似的颜色或强度。这可以用于分割具有不同颜色或亮度的对象。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
import cv2# 读取图像
image = cv2.imread('1.png')# 将图像像素转换为特征向量
rows, cols, channels = image.shape
features = image.reshape(rows * cols, channels)# 使用K均值聚类
num_clusters = 2
kmeans = KMeans(n_clusters=num_clusters)
kmeans.fit(features)# 获取聚类中心和标签
centroids = kmeans.cluster_centers_
labels = kmeans.labels_# 重构图像
reconstructed_image = centroids[labels].reshape(rows, cols, channels)# 显示结果
plt.figure(figsize=(12, 6))
plt.subplot(121)
plt.title('Original Image')
plt.imshow(image)
plt.axis('off')plt.subplot(122)
plt.title('Clustered Image')
plt.imshow(reconstructed_image.astype(np.uint8))
plt.axis('off')plt.show()

HSV空间颜色分割

HSV(色相、饱和度、明度)颜色空间是一种常用于图像处理和计算机视觉中的颜色表示方法。在HSV颜色空间中,颜色信息被分成三个成分:

  1. H(色相):表示颜色的类型或种类。它以角度度量颜色的类型,从0°到360°,对应于不同的颜色,如红色、绿色、蓝色等。例如,0°是红色,120°是绿色,240°是蓝色。

  2. S(饱和度):表示颜色的鲜艳程度或纯度。S值为0表示灰阶色,而S值为1表示完全饱和的颜色。饱和度值介于0和1之间。

  3. V(明度):表示颜色的亮度。V值为0表示黑色,V值为1表示最大亮度的颜色。明度值介于0和1之间。

HSV颜色空间非常适合进行颜色分割,因为它将颜色信息与亮度信息分开,使得颜色分割更容易。在进行HSV颜色分割时,通常可以根据色相(H)和饱和度(S)来选择感兴趣的颜色范围,并将其分割出来。

import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取彩色图像
image = cv2.imread('1.png')# 将图像转换到HSV颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# 定义亮绿色和浅绿色的HSV范围
bright_green_lower = np.array([38, 120, 100])
bright_green_upper = np.array([80, 255, 255])pale_green_lower = np.array([35, 100, 100])
pale_green_upper = np.array([40, 255, 255])# 创建颜色掩膜
bright_green_mask = cv2.inRange(hsv_image, bright_green_lower, bright_green_upper)
pale_green_mask = cv2.inRange(hsv_image, pale_green_lower, pale_green_upper)# 合并掩膜,得到亮绿色和浅绿色区域
green_regions = cv2.bitwise_or(bright_green_mask, pale_green_mask)# 提取绿色区域
green_image = cv2.bitwise_and(image, image, mask=green_regions)# 显示结果
plt.figure(figsize=(12, 6))
plt.subplot(231)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Original Image')
plt.axis('off')plt.subplot(232)
plt.imshow(pale_green_mask, cmap='gray')
plt.title('pale Green Mask')
plt.axis('off')plt.subplot(233)
plt.imshow(cv2.cvtColor(green_image, cv2.COLOR_BGR2RGB))
plt.title('Green Regions')
plt.axis('off')plt.subplot(234)
plt.imshow(cv2.cvtColor(bright_green_mask, cv2.COLOR_BGR2RGB))
plt.title('Bright Green Mask')
plt.axis('off')plt.show()

for i in range(height):for j in range(150):if(pale_green_mask[i][j]==255):pale_green_mask[i][j]=0
pale_green_maskplt.figure(figsize=(12, 6))
plt.subplot(234)
plt.imshow(cv2.cvtColor(pale_green_mask, cv2.COLOR_BGR2RGB))
plt.title('Bright Green Mask')
plt.axis('off')plt.show()

#膨胀
pale_green_mask2=pale_green_mask
kernel_size = 2
kernel = np.ones((kernel_size, kernel_size), np.uint8)# 执行膨胀
pale_green_mask2 = cv2.dilate(pale_green_mask2, kernel, iterations=2)plt.figure(figsize=(12, 6))
plt.subplot(234)
plt.imshow(cv2.cvtColor(pale_green_mask2, cv2.COLOR_BGR2RGB))
plt.title('Bright Green Mask')
plt.axis('off')plt.show()


http://www.ppmy.cn/news/1082164.html

相关文章

博客系统后台前端UI设计

效果展示 API编写 index.js import axios from "./request"const fastdfs {delete: file/fastdfs/delete } const permission {search: "/sys/permission/search",add: "/sys/permission/add",update: "/sys/permission/update",d…

【Day-26慢就是快】代码随想录-二叉树-对阵二叉树

给定一个二叉树,检查它是否是镜像对称的。 —————————————————————————————————————————— 分析: 需要比较的是根节点的左右子树,且是两个子树的里侧和外侧的元素是否相等。 根据后序遍历算法&…

鉴源论坛 · 观模丨基于应用程序编程接口(API)的自动化测试(上)

作者 | 黄杉 华东师范大学软件工程学院博士 苏亭 华东师范大学软件工程学院教授 版块 | 鉴源论坛 观模 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 应用程序编程接口(API) 应用程序编程接口,英文全称为Applica…

【Java核心知识】ThreadLocal相关知识

ThreadLocal 什么是ThreadLocal ThreadLoacal类可以为每个线程保存一份独有的变量,该变量对于每个线程都是独占的。实现原理为每个Thread类中包含一个ThreadHashMap,key为变量的name,value为变量的值。 在日常使用中,我们可以通…

Systrace分析App性能学习笔记

学习Gracker Systrace系列文章,总结使用Systrace分析App性能的方法。推荐想通过Systrace学习Framework的同学,去看原文。 文章目录 概述Systrace使用流程Systrace 文件生成图形方式(不推荐)命令行方式 Systrace分析快捷键使用帧状态线程状态查看线程唤醒…

习题练习 C语言(暑期第三弹)

自我小提升! 前言一、存储地址二、逗号表达式三、除自身以外数组的乘积四、字节与二进制五、符号计算六、不用加减乘除做加法七、unsigned判断八、移位计算九、sizeof宏十、移位计算十一、移位计算十二、优先级判断十三、单词倒排总结 前言 重要的事说三遍&#xf…

C++算法 —— 分治(2)归并

文章目录 1、排序数组2、数组中的逆序对3、计算右侧小于当前元素的个数4、翻转对 1、排序数组 排序数组 排序数组也可以用归并排序来做。 vector<int> tmp;//写成全局是因为如果在每一次小的排序中都创建一次&#xff0c;更消耗时间和空间&#xff0c;设置成全局的就更高…

【C++】在子类中怎么调用父类的方法

2023年8月31日&#xff0c;周四上午 目录 使用父类作用域运算符::子类没有重写父类方法时子类重写了父类方法时使用this指针调用子类没有重写父类方法时 在C中,子类可以以以下几种方式调用父类的方法: 使用父类作用域运算符:: 这种方法既可以在子类没有重写父类方法时使用&am…