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 result

    return 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
相关推荐
毋小黑3 小时前
753K 参数打赢 SwinIR:CRAFT 用「高频先验」给 Transformer 超分查漏补缺
人工智能·opencv·计算机视觉
AI的探索之旅7 小时前
97 个 OpenCV 实例(二十九):三相机联合标定,把三只眼睛绑在一起
人工智能·opencv·计算机视觉
He BianGu20 小时前
【WPF-VisionMaster】机器视觉通用平台V5.0版本发行说明
opencv·c#·wpf·halcon·机器视觉·visionmaster
hhzz21 小时前
【OpenCV 入门到精通 10】视频分析与光流跟踪:背景减除与运动检测
人工智能·python·opencv·性能优化
辰辉创聚1 天前
重组蛋白聚集的形成机制及其对蛋白活性的影响
opencv·时序数据库·visual studio·重组蛋白·蛋白聚集·蛋白活性·蛋白聚集体
hhzz1 天前
【OpenCV 入门到精通 11】机器学习应用:KNN、SVM 与 K-Means 实战
人工智能·python·深度学习·opencv
lpfasd1231 天前
配置文件格式对比 与 AI Coding 的选择逻辑
python·flask·numpy
qq7422349841 天前
OpenCV 之外的另一半工具箱:Supervision 视觉工程实战
人工智能·opencv·计算机视觉
jzshmyt2 天前
我用 Python 从零“生成“了一个宇宙,然后让它观察自己(v14)
人工智能·pytorch·python·numpy·matplotlib·空间计算·scipy
搞AI的金鱼2 天前
Numpy
numpy