当前位置: 首页 > news >正文

python 对图像进行聚类分析

import cv2
import numpy as np
from sklearn.cluster import KMeans
import time# 中文路径读取
def cv_imread(filePath, cv2_falg=cv2.COLOR_BGR2RGB):   cv_img = cv2.imdecode(np.fromfile(filePath, dtype=np.uint8), cv2_falg)    return cv_img# 自定义装饰器计算时间
def compute_time(func):def compute(*args, **kwargs):st = time.time()result = func(*args, **kwargs)et = time.time()print('消费时间 %.6f s' % (et - st))return resultreturn compute@compute_time
def kmeans_img(image,  num_clusters, show=False):# 如果图像是灰度图(单通道),将其转换为三通道if len(image.shape) == 2:image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)# 将图像的形状进行调整以便进行 K 均值聚类,提高训练速度pixels = cv2.resize(image.copy(), None, fx=0.05, fy=0.05, interpolation=cv2.INTER_LINEAR)pixels = np.float32(pixels.reshape((-1, 3)))segmented_pixels = np.float32(image.reshape((-1, 3)))# 初始化 KMeans 模型并拟合数据kmeans = KMeans(n_clusters=num_clusters)kmeans.fit(pixels)# 获取每个像素所属的簇标签labels = kmeans.predict(segmented_pixels)# 根据簇标签,将图像像素值转换为簇中心值segmented_image = kmeans.cluster_centers_[labels]segmented_image = np.uint8(segmented_image.reshape(image.shape))if show:plt.figure(figsize=(10, 5))plt.subplot(1, 2, 1)plt.title('Original Image')plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.axis('off')plt.subplot(1, 2, 2)plt.title('Segmented Image')plt.imshow(segmented_image)plt.axis('off')plt.tight_layout()plt.show()return segmented_image
image_path =r"C:\Users\pc\Pictures\test\快.png"
image = cv_imread(image_path)
kmeans_img(image,4, show=True)

 使用opencv内设的kmeans函数:直接原图进行训练,然后获取每个像素点的类,速度慢。上述方法对图像进行一个缩放后,训练模型,然后用模型再预测原图的每个像素点,速度快。

def kmeans_img(image, num_clusters, show=True):# 如果图像是灰度图(单通道),将其转换为三通道if len(image.shape) == 2:image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)# image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)print(image.shape)# 将图像的形状进行调整以便进行 K 均值聚类pixels = image.reshape((-1, 3))pixels = np.float32(pixels)# 设定 kmeans 参数并运行算法criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.2)_, labels, centers = cv2.kmeans(pixels, num_clusters, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)# 将图像像素值转换为簇中心值centers = np.uint8(centers)segmented_image = centers[labels.flatten()]segmented_image = segmented_image.reshape(image.shape)if show:# 显示原始图像和分割后的图像plt.figure(figsize=(10, 5))plt.subplot(1, 2, 1)plt.title('Original Image')plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.axis('off')plt.subplot(1, 2, 2)plt.title('Segmented Image')plt.imshow(segmented_image)plt.axis('off')plt.tight_layout()plt.show()return segmented_image

http://www.lryc.cn/news/234419.html

相关文章:

  • 程序员导航站
  • BIO、NIO、AIO三者的区别及其应用场景(结合生活例子,简单易懂)
  • 深度学习YOLO图像视频足球和人体检测 - python opencv 计算机竞赛
  • 系列七、JVM的内存结构【堆(Heap)】
  • 什么是Selenium?如何使用Selenium进行自动化测试?
  • 【蓝桥杯 第十五届模拟赛 Java B组】训练题(A - I)
  • 【数据结构】手撕双向链表
  • 性能测试 —— Jmeter接口处理不低于200次/秒-场景
  • Qt中使用QNetworkAccessManager类发送https请求时状态码返回0
  • Linux - 物理内存管理 - memmap
  • Python爬虫动态ip代理防止被封的方法
  • 01Urllib
  • python爬取酷我音乐 根据歌名进行爬取
  • 【深度学习】吴恩达课程笔记(五)——超参数调试、batch norm、Softmax 回归
  • 腾讯云轻量级服务器和云服务器什么区别?轻量服务器是干什么用的
  • 解决:虚拟机远程连接失败
  • SpringBoot项目集成发邮件功能
  • 【Spring篇】使用注解进行开发
  • Flink(六)【DataFrame 转换算子(下)】
  • 【2023春李宏毅机器学习】生成式学习的两种策略
  • Android13 adb 无法连接?
  • Ubuntu 20.04 调整交换分区大小
  • 将Agent技术的灵活性引入RPA,清华等发布自动化智能体ProAgent
  • 高济健康:数字化科技创新与新零售碰撞 助推医疗产业优化升级
  • SystemVerilog学习 (5)——接口
  • vue3插槽的使用
  • IPTABLES问题:DNAT下如何解决内网访问内部服务器问题
  • 异步任务线程池——最优雅的方式创建异步任务
  • uniapp 跨页面传值及跨页面方法调用
  • 无线物理层安全大作业