python--利用LAB信息对彩色图像进行聚类(cv2图像rgb顺序、python列表list转数组array)

python–利用LAB信息对彩色图像进行聚类(cv2图像rgb顺序、python列表list转数组array)

输入:多张舌像,一次输入一张舌像
目的:对输入的一张舌像利用LAB信息,将像素聚类,这里聚类为4类
输出:聚类中心(每一个中心用lab值表示)

import cv2
import matplotlib.pyplot as plt
import numpy as np
import os

# 目的:读取图片,利用【l* a* b*】进行聚类,将聚类中心保存到npy文件,在画出的色度图上画出这些聚类中心


# 读取指定文件夹下所有文件的名字
def readname(filepath):
    name = os.listdir(filepath)
    return name


# 利用[l* a* b*]实现聚类
def seg_kmeans_color(img):
    #img = cv2.imread('D:\\MATLABfile\\2020-9-24\\resize.png', cv2.IMREAD_COLOR) # cv2读入三通道图像的顺序是BGR
    img = cv2.cvtColor(img, cv2.COLOR_BGR2LAB) # BGR转到LAB空间
    # 变换图像通道bgr->rgb
    # b, g, r = cv2.split(img)
    # img = cv2.merge([r, g, b])
    # 3个通道展平 二维矩阵展成一维向量
    img_flat = img.reshape((img.shape[0] * img.shape[1], 3))
    img_flat = np.float32(img_flat)
    # 迭代参数
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TermCriteria_MAX_ITER, 20, 0.5)
    flags = cv2.KMEANS_RANDOM_CENTERS
    # 聚类,这里k=4 :背景、舌质、舌苔、异常区域
    compactness, labels, centers = cv2.kmeans(img_flat, 4, None, criteria, 10, flags)
    # 显示结果
    # img_output = labels.reshape((img.shape[0], img.shape[1]))
    # plt.subplot(121), plt.imshow(img), plt.title('input')
    # plt.subplot(122), plt.imshow(img_output), plt.title('kmeans')
    # plt.show()
    # print(centers)
    return centers

#
# cv2.cvtColor(img, cv2.COLOR_LAB2RGB)


if __name__ == '__main__':
    FilePath = 'F:/舌色/05-class/淡白'
    name = readname(FilePath)
    for i in range(len(name)):
        img_name = FilePath + '/' + name[i]
        img = cv2.imread(img_name)  # cv2读入顺序是bgr
        b, g, r = cv2.split(img)
        img = cv2.merge([r, g, b])
        img_lab = cv2.cvtColor(img, cv2.COLOR_RGB2LAB)  
        # RGB颜色空间转换到LAB颜色空间
        centers = seg_kmeans_color(img_lab)
---------------------------------------------------

注意点:cv2.imread(path) # 读入三通道图的顺序是bgr
          
        from PIL import Image
        Image.open(path) # 读入三通道图像的顺序是rgb

        a = []; # 建立空列表
        np.array(a); # 列表转换为数组,注意空列表无法这样转换为数组
        a.tolist(); # 转换为list


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是利用FCM算法对灰度图像进行聚类,并提取掩膜的Python代码: ```python import numpy as np from sklearn.cluster import KMeans from skimage import io import matplotlib.pyplot as plt def fcm(image, clusters, m=2, max_iter=100, error=1e-5): """ Fuzzy C-means clustering algorithm Args: image: input grayscale image clusters: number of clusters m: fuzziness parameter max_iter: maximum number of iterations error: error tolerance Returns: membership: membership matrix """ # Initialize membership matrix randomly rows, cols = image.shape membership = np.random.rand(rows, clusters) membership = membership / np.sum(membership, axis=1)[:, np.newaxis] # Iterate until convergence or maximum number of iterations reached for i in range(max_iter): # Calculate centroids centroids = np.dot(image.T, membership) / np.sum(membership, axis=0) # Calculate distances distances = np.zeros((rows, clusters)) for j in range(clusters): distances[:, j] = np.linalg.norm(image - centroids[j], axis=1) # Update membership matrix membership_new = 1 / (distances ** (2 / (m - 1))) membership_new = membership_new / np.sum(membership_new, axis=1)[:, np.newaxis] # Check for convergence if np.linalg.norm(membership - membership_new) < error: break membership = membership_new return membership # Load image image = io.imread('image.jpg', as_gray=True) # Apply FCM clustering clusters = 2 membership = fcm(image, clusters) # Extract mask mask = np.argmax(membership, axis=1).reshape(image.shape) # Display results fig, ax = plt.subplots(1, 2, figsize=(10, 5)) ax[0].imshow(image, cmap='gray') ax[0].set_title('Original Image') ax[1].imshow(mask, cmap='gray') ax[1].set_title('Mask') plt.show() ``` 其中,`fcm()` 函数实现了FCM算法,返回聚类的成员矩阵。`image` 表示输入的灰度图像,`clusters` 表示聚类的数量,`m` 表示模糊度参数,`max_iter` 表示最大迭代次数,`error` 表示误差容限。该函数返回聚类的成员矩阵。 在主程序中,首先加载灰度图像,然后调用 `fcm()` 函数进行聚类。接着,利用 `np.argmax()` 函数提取最大成员值对应的聚类标签,得到掩膜。最后,利用 `plt.imshow()` 函数显示原始灰度图像和掩膜。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值