Python 提取图片主色调

news2025/4/19 21:19:16

Python 提取图片主色调

  • 效果
  • 代码编写

效果

有个要提取图片主色调的需求,记录一下。
获取图片中的主色调

代码编写

import numpy as np
import cv2
from sklearn.cluster import KMeans
from skimage.color import rgb2lab, deltaE_cie76
from collections import Counter


# 创建默认变量

# 这是用于确定背景的阈值
remove_background_threshold = 235
# 这是用于确定要提取的颜色数量的参数
extract_colors_num_colors = 8
# 这是用于确定两种颜色是否相似的阈值
is_similar_color_threshold = 30

def remove_background(image, threshold=remove_background_threshold):
    # Convert image to grayscale
    # 将图像转换为灰度图
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # Create a binary mask of the background
    # 创建一个背景的二值掩码
    _, mask = cv2.threshold(gray, threshold, 255, cv2.THRESH_BINARY_INV)
    # Apply the mask to the original image
    # 将掩码应用到原始图像上
    result = cv2.bitwise_and(image, image, mask=mask)
    return result

def get_color_name(lab):
    colors = {
        "red": [53.23, 80.11, 67.22],
        "green": [87.74, -86.18, 83.18],
        "blue": [32.30, 79.19, -107.86],
        "yellow": [97.14, -21.55, 94.48],
        "cyan": [91.11, -48.09, -14.13],
        "magenta": [60.32, 98.24, -60.83],
        "black": [0, 0, 0],
        "white": [100, 0.00, -0.01],
        "gray": [53.59, 0, 0],
        "orange": [67.79, 43.30, 74.93],
        "purple": [29.78, 58.94, -36.50],
        "brown": [38.91, 19.36, 22.29],
        "pink": [88.22, 17.75, 3.18],
        "dark red": [39.35, 62.75, 49.91],
        "light blue": [79.19, -11.03, -26.23],
        "dark green": [35.49, -46.47, 35.45],
        "light green": [88.72, -42.89, 57.40],
        "navy": [16.73, 37.09, -65.49],
        "burgundy": [28.71, 49.35, 26.27],
        "beige": [89.02, -1.39, 11.09],
        "olive": [51.87, -12.93, 56.67],
        "teal": [49.31, -28.83, -8.48],
        "maroon": [25.64, 45.52, 20.77],
        "forest green": [36.23, -37.96, 30.20],
    }
    
    min_dist = float('inf')
    closest_color = None
    for color_name, color_lab in colors.items():
        dist = np.sqrt(sum((lab - color_lab) ** 2))
        if dist < min_dist:
            min_dist = dist
            closest_color = color_name
    return closest_color

def is_similar_color(color1, color2, threshold=is_similar_color_threshold):
    lab1 = rgb2lab([[color1]])[0][0]
    lab2 = rgb2lab([[color2]])[0][0]
    diff = deltaE_cie76(lab1, lab2)
    return diff < threshold

def extract_colors(image_path, num_colors=extract_colors_num_colors):
    # Read image
    # 读取图像
    image = cv2.imread(image_path)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    
    # Remove background
    # 去除背景
    image_no_bg = remove_background(image)
    # Reshape image
    # 重塑图像
    pixels = image_no_bg.reshape(-1, 3)
    # Remove black pixels (background)
    # 删除黑色像素(背景)
    pixels = pixels[~np.all(pixels == [0, 0, 0], axis=1)]
    
    if len(pixels) == 0:
        return []  # Return empty list if all pixels were removed   返回空列表,如果所有像素都被删除
    
    # Perform k-means clustering
    # 执行k-means聚类
    kmeans = KMeans(n_clusters=num_colors, random_state=42, n_init=10)
    kmeans.fit(pixels)
    
    # Get the colors
    # 获取颜色
    colors = kmeans.cluster_centers_
    # Convert colors to LAB space
    # 将颜色转换为LAB空间
    colors_lab = rgb2lab(colors.reshape(1, -1, 3)).reshape(-1, 3)
    # Get color names
    # 获取颜色名称
    color_names = [get_color_name(color) for color in colors_lab]
    # Count pixels for each cluster
    # 计算每个聚类的像素数
    pixel_counts = Counter(kmeans.labels_)
    # Sort colors by frequency
    # 按频率对颜色进行排序
    sorted_colors = sorted(zip(color_names, colors, pixel_counts.values()), key=lambda x: x[2], reverse=True)
    # Remove similar colors
    # 删除相似颜色
    unique_colors = []
    for color_name, color_rgb, count in sorted_colors:
        if color_name not in [uc[0] for uc in unique_colors] and \
           not any(is_similar_color(color_rgb, existing_color) for _, existing_color, _ in unique_colors):
            unique_colors.append((color_name, color_rgb, count))
        if len(unique_colors) == 3:
            break
    
    return [color_name for color_name, _, _ in unique_colors]


# Example usage
image_path = r'D:\Project\Python_Project\yitiaolong\expimage_1.jpg'
main_colors = extract_colors(image_path)
print("Main colors:", main_colors)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1878585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

寄存器相关知识点

文章目录 寄存器是什么&#xff1f;举例子—如何去看手册来配置寄存器寄存器地址知识点输出功能具体实现&#xff0c;在linux编写代码的话 其他 相关视频 寄存器是什么&#xff1f; 本质就是一个存储器&#xff0c;写内存和写指针都是一样的 寄存器里的值和RAM的值&#xff0c…

Android 11.0 修改系统显示大小导航栏消失

Android 11.0 修改系统显示大小导航栏消失 1.显示大小设置为大时&#xff0c;导航栏图标不显示。 设置为大&#xff0c;较大&#xff0c;最大时&#xff0c;导航栏图标不显示。 2.开始怀疑是导航栏被隐藏了&#xff0c;各种折腾无效。 3.发现&#xff1a; frameworks/base/pa…

springboot+vue 开发记录(八) 前端项目打包

本篇文章涉及到前端项目打包的一些说明 我打包后的项目在部署到服务器上后&#xff0c;访问页面时按下F12出现了这种情况&#xff1a; 它显示出了我的源码&#xff0c;这是一种很不安全的行为 该怎么办&#xff1f;很简单&#xff1a; 我们只需要下载一点点插件&#xff0c;再…

说说MQ在你项目中的应用(二)商品支付

看了不少关于MQ的文章&#xff0c;也对MQ的作用做了一些总结。通常来说MQ有三大功能&#xff1a;异步处理、系统解耦和流量削峰。但我觉得这些功能本质上都是围绕着异步这个核心来的&#xff0c;只是针对不同的业务场景做了些调整。 现在市面上常用的MQ中间件&#xff0c;如Ra…

大数据之Linux部署常用命令脚本封装

文章目录 编写集群命令执行脚本xcall集群命令执行1. 脚本需求2. 需求分析3. 脚本实现3.1 创建脚本存放目录3.2 编写xcall脚本3.3 修改脚本执行权限3.4 测试脚本 编写集群分发脚本xsync集群分发脚本1. 脚本需求2. 需求分析3. 脚本实现3.1 创建脚本存放目录3.2 编写xsync脚本3.3 …

amis-editor 注册自定义组件

建议先将amis文档从头到尾&#xff0c;仔细看一遍。 参考&#xff1a;amis - 低代码前端框架 amis 的渲染过程是将 json 转成对应的 React 组件。先通过 json 的 type 找到对应的 Component&#xff0c;然后把其他属性作为 props 传递过去完成渲染。 import * as React from …

[数据集][目标检测]睡岗检测数据集VOC+YOLO格式3290张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3316 标注数量(xml文件个数)&#xff1a;3316 标注数量(txt文件个数)&#xff1a;3316 标注…

了解C# 中的集合(包括泛型和非泛型)

跨站点脚本 (XSS) 攻击是一种严重的安全威胁&#xff0c;恶意脚本会注入其他用户查看的网页中。本文演示了如何在 ASP.NET Core MVC 中构建一个简单的博客应用程序&#xff0c;同时使用内置安全功能和最佳实践来防止 XSS 攻击。 步骤 1.创建 ASP.NET Core MVC 项目 创建新的 …

Ollama中文版部署

M1部署Ollama Ollama中文网站: Featured - 精选 - Ollama中文网 下载网址: Download Ollama on macOS 安装后运行llma3模型: ollama run llama3:8b 界面使用: GitHub - open-webui/open-webui: User-friendly WebUI for LLMs (Formerly Ollama WebUI) 部署open-webui: do…

摸鱼大数据——Spark基础——Spark环境安装——PySpark搭建

三、PySpark环境安装 PySpark: 是Python的库, 由Spark官方提供. 专供Python语言使用. 类似Pandas一样,是一个库 Spark: 是一个独立的框架, 包含PySpark的全部功能, 除此之外, Spark框架还包含了对R语言\ Java语言\ Scala语言的支持. 功能更全. 可以认为是通用Spark。 功能 P…

【教学类-64-08】20240629彩棒鱼骨图(五)AAB排列 6.5*1CM 6选2根 30种

背景需求&#xff1a; 【教学类-64-04】20240619彩棒鱼骨图&#xff08;一&#xff09;6.5*1CM 6根棒子720种-CSDN博客文章浏览阅读897次&#xff0c;点赞23次&#xff0c;收藏13次。【教学类-64-04】20240619彩棒鱼骨图&#xff08;一&#xff09;6.5*1CM 6根棒子720种https:…

Java学习 - Redis开发规范与安全

开发规范 key设计 因素说明键名可读性&#xff0c;可管理性业务名:表名:字段名键名简洁性user:{uid}:friends:message:{mid}简化为u:{uid}&#x1f1eb;&#x1f1f7;m:{mid}与embstr和raw有关键名不包含特殊字符比如空格&#xff0c;制表符等&#xff0c;最好只有字母&#…

【Lua】第三篇:基本变量类型介绍

文章目录 一. 变量类型介绍二. 基本知识三. 基本类型介绍1. 空类型&#xff08;nil&#xff09;2. 数值类型&#xff08;number&#xff09;3. 字符串类型&#xff08;string&#xff09;4. 布尔类型&#xff08;boolean&#xff09; 一. 变量类型介绍 Lua中一共有如下8中变量…

Linux:RAID磁盘阵列

目录 一、RAID&#xff08;磁盘阵列&#xff09; 1.1、概念 1.2、RAID 0&#xff08;条带化存储&#xff09; 1.3、RAID 1&#xff08;镜像存储&#xff09; 1.4、RAID 5 1.5、RAID 6 1.6、RAID 10 (先做镜像&#xff0c;再做条带) 二、创建RAID 2.1、建立RAID 0 …

利用 Docker 简化 Nacos 部署:快速搭建 Nacos 服务

利用 Docker 简化 Nacos 部署&#xff1a;快速搭建 Nacos 服务 引言 在微服务架构中&#xff0c;服务注册与发现是确保服务间通信顺畅的关键组件。Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;作为阿里巴巴开源的一个服务发现和配置管理平台&…

Spring事务及其传播机制(一)

目录 1.事务回顾 1.1什么是事务 1.2事务的四大重要特性&#xff08;ACID&#xff09; 1.3事务的操作 2.Spring中事务的实现 2.1编程式事务&#xff08;了解&#xff09; 2.2声明式事务Transactional 3.Transactional作用 3.1重新抛出异常 3.2手动回滚事务 1.事务回顾…

【Redis】SpringBoot连接Redis

1. 创建项目并配置文件 勾选NoSQL中的 Spring Data Redis。当然,把 Web 中的 SpringWeb 也勾选一下.方便写接口进行后续测试。 在 application.yml 中配置 2. 不同数据类型使用Demo 在SpringBoot中&#xff0c;为我们提供了StringRedisTemplate类&#xff0c;供我们处理一些文…

详细介绍MySQL的索引(上)

索引 索引概述 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用(指向数据&#xff0c;这样就可以在这些数据结构上实现高级查找算法&#xff0c;这种数据结…

VisualStudio2019受支持的.NET Core

1.VS Studio2019受支持的.NET Core&#xff1f; 适用于 Visual Studio 的 .NET SDK 下载 (microsoft.com) Visual Studio 2019 默认并不直接支持 .NET 6 及以上版本。要使用 .NET 6 或更高版本&#xff0c;你需要在 Visual Studio 2019 中采取额外步骤&#xff0c;比如安装相应…

<电力行业> - 《第9课:输电(二)》

4 输送电能流程 输送电能总共有&#xff1a;发电站→升压变压器→高压输电线→降压变压器→用电单位等五个流程。 电力工业初期&#xff0c;发电厂建在电力用户附近&#xff0c;直接向用户送电&#xff0c;所以那个时候只有发电和用电两个环节。 随着电力生产规模和负荷中心规…