返回顶部
首页 > 资讯 > 后端开发 > Python >Python+OpenCV中如何利用K-Means 聚类进行色彩量化
  • 706
分享到

Python+OpenCV中如何利用K-Means 聚类进行色彩量化

2023-06-21 22:06:56 706人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

小编给大家分享一下python+OpenCV中如何利用K-Means 聚类进行色彩量化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!利用 K-Means

小编给大家分享一下python+OpenCV中如何利用K-Means 聚类进行色彩量化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    利用 K-Means 聚类进行色彩量化

    色彩量化问题可以定义为减少图像中颜色数量的过程。色彩量化对于某些设备显示图像非常关键,这些设备可能由于内存限制等原因只能显示有限颜色,因此,在这些设备上显示色彩通常需要在准确性和减少颜色数量之间进行权衡,在利用 K-Means 聚类进行色彩量化时,权衡两者是通过正确设置 K 参数来进行的。

    利用 K-Means 聚类算法来执行色彩量化,簇中心数据由 3 个特征组成,它们对应于图像每个像素的 B、G 和 R 值。因此,关键是将图像转换为数据:

    data = np.float32(image).reshape((-1, 3))

    为了观察如何权衡准确性和颜色数,我们使用不同 K 值 (3 、 5 、 10 、 20 和 40) 执行聚类过程,以查看生成的图像如何变化,如果我们想要只有 3 种颜色 (K = 3) 的结果图像,需要执行以下操作:

    加载 BGR 图像:

    img = cv2.imread('example.jpg')

    使用 color_quantization() 函数执行色彩量化:

    def color_quantization(image, k):    # 将图像转换为数据    data = np.float32(image).reshape((-1, 3))    # 算法终止条件    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 1.0)    # K-Means 聚类    ret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)    # 簇中心    center = np.uint8(center)    # 将具有 k 颜色中心的图像转换为 uint8    result = center[label.flatten()]    result = result.reshape(img.shape)    return resultcolor_3 = color_quantization(img, 3)

    color_quantization() 函数中,关键点是利用 cv2.kmeans() 方法。最后,可以用 k 种颜色来构建图像,用它们对应的中心值替换每个像素值,程序的运行结果如下所示:

    Python+OpenCV中如何利用K-Means 聚类进行色彩量化

    Python+OpenCV中如何利用K-Means 聚类进行色彩量化

    完整代码

    利用 K-Means 聚类进行色彩量化的完整代码如下所示:

    import numpy as npimport cv2from matplotlib import pyplot as pltdef show_img_with_matplotlib(color_img, title, pos):    img_RGB = color_img[:, :, ::-1]    ax = plt.subplot(2, 4, pos)    plt.imshow(img_RGB)    plt.title(title, fontsize=8)    plt.axis('off')def color_quantization(image, k):    # 将图像转换为数据    data = np.float32(image).reshape((-1, 3))    # 算法终止条件    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 1.0)    # K-Means 聚类    ret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)    # 簇中心    center = np.uint8(center)    # 将具有 k 颜色中心的图像转换为 uint8    result = center[label.flatten()]    result = result.reshape(img.shape)    return resultfig = plt.figure(figsize=(16, 8))plt.suptitle("Color quantization using K-means clustering alGorithm", fontsize=14, fontweight='bold')# 图片加载img = cv2.imread('example.png')show_img_with_matplotlib(img, "original image", 1)# 使用不同 K 值进行色彩量化for i in range(7):    color = color_quantization(img, (i+1) * 10)    show_img_with_matplotlib(color, "color quantization (k = {})".fORMat((i+1) * 10), i+2)plt.show()

    显示色彩量化后的色彩分布

    可以扩展以上程序使其显示色彩量化后的色彩分布,该色彩分布显示了分配给每个聚类中心的像素数。只需扩展 color_quantization() 函数已被修改为包含所需功能:

    import collectionsdef color_quantization(image, k):    # 将图像转换为数据    data = np.float32(image).reshape((-1, 3))    # 算法终止条件    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 1.0)    # K-Means 聚类    ret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)    # 簇中心    center = np.uint8(center)    # 将具有 k 颜色中心的图像转换为 uint8    result = center[label.flatten()]    result = result.reshape(img.shape)    # 统计分配给每个聚类中心的像素数    counter = collections.Counter(label.flatten())    print(counter)    # 计算输入图像的总像素数    total = img.shape[0] * img.shape[1]    # 为色彩分布图像指定宽度和高度:    desired_width = img.shape[1]        desired_height = 70    desired_height_colors = 50    # 初始化色彩分布图像    color_distribution = np.ones((desired_height, desired_width, 3), dtype='uint8') * 255    start = 0    for key, value in counter.items():        # 归一化        value_normalized = value / total * desired_width        end = start + value_normalized        # 绘制与当前颜色对应的矩形        cv2.rectangle(color_distribution, (int(start), 0), (int(end), desired_height_colors), center[key].tolist(), -1)        start = end    return np.vstack((color_distribution, result))

    上述代码中,使用 collections.Counter() 来统计分配给每个聚类中心的像素数:

    counter = collections.Counter(label.flatten())

    例如,如果 K = 10,则可以得到如下结果:

    Counter({7: 37199, 3: 36302, 0: 29299, 5: 23987, 6: 23895, 1: 20077, 9: 19814, 8: 18427, 4: 16221, 2: 14779})

    构建色彩分布图像后,将其与色彩量化后的图像连接在一起:

    np.vstack((color_distribution, result))

    程序的输出如下所示:

    Python+OpenCV中如何利用K-Means 聚类进行色彩量化

    从上图可以看出,使用 K-Means 聚类算法应用色彩量化后改变参数 k (10、20、30、40、50、60 和 70) 的结果,k 值越大产生的图像越逼真。

    Note:除了 color_quantization() 函数外,由于其他代码并未修改,因此不再另外给出。 

    以上是“Python+OpenCV中如何利用K-Means 聚类进行色彩量化”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网Python频道!

    --结束END--

    本文标题: Python+OpenCV中如何利用K-Means 聚类进行色彩量化

    本文链接: https://lsjlt.com/news/301192.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Python+OpenCV中如何利用K-Means 聚类进行色彩量化
      小编给大家分享一下Python+OpenCV中如何利用K-Means 聚类进行色彩量化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!利用 K-Means...
      99+
      2023-06-21
    • Python+OpenCV实战之利用 K-Means 聚类进行色彩量化
      目录前言利用 K-Means 聚类进行色彩量化完整代码显示色彩量化后的色彩分布前言 K-Means 聚类算法的目标是将 n 个样本划分(聚类)为 K 个簇,在博文《OpenCV与机器...
      99+
      2024-04-02
    • 利用Python如何实现K-means聚类算法
      目录前言算法原理 目标函数 算法流程  Python实现 总结 前言 K-Means 是一种非常简单的聚类算法(聚类算法都属于无监督学习)。给定固定数量的聚类和输入数据集,...
      99+
      2024-04-02
    • Python如何使用OpenCV和K-Means聚类对毕业照进行图像分割
      这篇文章给大家分享的是有关Python如何使用OpenCV和K-Means聚类对毕业照进行图像分割的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。我们将看到一种图像分割方法,即K-Means Clustering。...
      99+
      2023-06-15
    • Python sklearn中的K-Means聚类如何使用
      这篇文章主要讲解了“Python sklearn中的K-Means聚类如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python sklearn中的K-Means...
      99+
      2023-07-04
    • Python使用OpenCV和K-Means聚类对毕业照进行图像分割
      图像分割是将图像分割成多个不同区域(或片段)的过程。目标是将图像的表示变成更容易和更有意义的图像。 在这篇博客中,我们将看到一种图像分割方法,即K-Means Clustering。...
      99+
      2024-04-02
    • OpenCV利用K-means实现根据颜色进行图像分割
      目录K-means算法分割应用:分类实例 K-means算法分割 K-means是一种经典的无监督聚类算法---不需要人工干预。 算法原理: (1)随机选择两个中心点; ...
      99+
      2022-11-13
      OpenCV K-means图像分割 OpenCV 图像分割 OpenCV K-means
    • 如何使用Python语言实现K-Means聚类算法
      这篇文章给大家分享的是有关如何使用Python语言实现K-Means聚类算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 概述1.1 无监督学习      在一个典型的监督学习中...
      99+
      2023-06-26
    • Python中如何利用PyVista进行mesh的色彩映射
      这篇文章给大家分享的是有关Python中如何利用PyVista进行mesh的色彩映射的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。PyVista简介PyVista是什么PyVista 是一个:VTK for hu...
      99+
      2023-06-14
    • 如何利用OpenCV进行特征(颜色、形状)提取
      目录图像处理1. 颜色2. 形状总结图像处理 图像处理所做的只是从图像中提取有用的信息,从而减少数据量,但保留描述图像特征的像素。 下面从图像中提取颜色、形状和纹理特征的方法开始 1...
      99+
      2024-04-02
    • 如何利用Python和OpenCV对图像进行加水印详解
      目录前言🌌 第 1 步:导入 OpenCV 并读取logo和要应用水印的图像💨 第 2步:计算两个图像的高度和宽度🚀 第 3 步:将水...
      99+
      2024-04-02
    • 在Python中如何使用OpenCV进行直线检测
      这篇文章主要介绍了在Python中如何使用OpenCV进行直线检测的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇在Python中如何使用OpenCV进行直线检测文章都会有所收获,下面我们一起来看看吧。1. 引言...
      99+
      2023-06-29
    • 如何利用Python中int()函数进行数据类型转换
      利用Python中的int()函数进行数据类型转换是一种常见的操作,尤其是在处理输入的字符串数据时,将其转换为整数类型。本文将介绍如何利用int()函数进行数据类型转换,并给出具体的代...
      99+
      2024-04-02
    • 如何在Android中利用TextView对字体颜色进行更改
      如何在Android中利用TextView对字体颜色进行更改?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Android 实现不同字体颜色的TextView实现代码:packa...
      99+
      2023-05-31
      android roi textview
    • Redis中如何利用序列化进行数据分片
      Redis中可以使用序列化来对数据进行分片。在分片时,可以根据数据键名进行序列化处理,然后根据序列化后的数据进行分片操作。 具体步骤...
      99+
      2024-04-29
      Redis
    • python中如何利用selenium进行浏览器爬虫
      这篇文章给大家介绍python中如何利用selenium进行浏览器爬虫,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。相信大家刚开始在做爬虫的时候,是不是requests和sound这两个库来使用,这样确实有助于我们学习...
      99+
      2023-06-02
    • 阿里云ECS部署微服务如何利用流量进行优化
      随着微服务架构的普及,越来越多的企业开始将其业务部署到云上。然而,对于那些依赖流量进行业务优化的企业来说,如何在阿里云ECS上部署微服务并充分利用流量是一个重要问题。本文将详细说明如何解决这个问题。 随着互联网的不断发展,微服务架构已成为一...
      99+
      2023-12-17
      阿里 流量 ECS
    • 如何在python中利用request库对cookie进行处理
      如何在python中利用request库对cookie进行处理?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python是什么意思Python是一种跨平台的、具...
      99+
      2023-06-06
    • 在java中excel数据如何利用POI进行批量导入
      本篇文章给大家分享的是有关在java中excel数据如何利用POI进行批量导入,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、定义  Apache POI是Apache软件基...
      99+
      2023-05-31
      java poi excel
    • 如何在C#项目中利用OpenCV对图片中人物的头像进行剪切
      这篇文章主要介绍了如何在C#项目中利用OpenCV对图片中人物的头像进行剪切,此处给大家介绍的非常详细,对大家的学习或工作具有一定的参考价值,需要的朋友可以参考下:准备工作首先创建一个Wpf项目——OpenCV_Face_Wpf,这里版本使...
      99+
      2023-06-06
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作