我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

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

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

    Python如何使用OpenCV和K-Means聚类对毕业照进行图像分割

    这篇文章给大家分享的是有关Python如何使用OpenCV和K-Means聚类对毕业照进行图像分割的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。我们将看到一种图像分割方法,即K-Means Clustering。
    2023-06-15

    Python中如何利用PyVista进行mesh的色彩映射

    这篇文章给大家分享的是有关Python中如何利用PyVista进行mesh的色彩映射的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。PyVista简介PyVista是什么PyVista 是一个:VTK for hu
    2023-06-14

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录