返回顶部
首页 > 资讯 > 后端开发 > Python >基于Python实现图片主题色的提取
  • 944
分享到

基于Python实现图片主题色的提取

2024-04-02 19:04:59 944人浏览 薄情痞子

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

摘要

目录前言实现流程安装依赖提取主题色测试前言 在 Groove 音乐中,当我们改变歌曲时,底部播放栏的颜色会随专辑封面而变,比如下图中播放栏的颜色变成了 aiko 衣服的颜色。下面我们

前言

在 Groove 音乐中,当我们改变歌曲时,底部播放栏的颜色会随专辑封面而变,比如下图中播放栏的颜色变成了 aiko 衣服的颜色。下面我们会在 python 中实现相同的效果,也就是提取出图片中的主题色。

实现流程

安装依赖

提取主题色有很多方法,比如使用 k-means 聚类,选出 k 个 RGB 坐标的聚类中心,但是速度会差一些,我们这里换成中位切分法。已经有人为我们实现好这个算法了,我们可以拿来就用。

pip install color-thief

提取主题色

color-thief 虽然可以很好地提取出候选的主题色,但还是需要我们亲自挑选出合适的主题色,甚至对主题色做出一些微调。比如上图中的文字是浅色的,如果提取到的主题色也是浅色的,效果就很差了。下面是代码:

# coding: utf-8
from math import floor

import numpy as np
from colorthief import ColorThief


class DominantColor:
    """ 图像主题色类 """

    @claSSMethod
    def getDominantColor(cls, imagePath: str):
        """ 获取指定图片的主题色

        Parameters
        ----------
        imagePath: str
            图片路径

        Returns
        -------
        r, g, b: int
            主题色各个通道的灰度值
        """
        colorThief = ColorThief(imagePath)

        # 调整图像大小,加快运算速度
        if max(colorThief.image.size) > 400:
            colorThief.image = colorThief.image.resize((400, 400))

        palette = colorThief.get_palette(quality=9)

        # 调整调色板明度
        palette = cls.__adjustPaletteValue(palette)
        for rgb in palette[:]:
            h, s, v = cls.rgb2hsv(rgb)
            if h < 0.02:
                palette.remove(rgb)
                if len(palette) <= 2:
                    break

        # 挑选主题色
        palette = palette[:5]
        palette.sort(key=lambda rgb: cls.colorfulness(*rgb), reverse=True)

        return palette[0]

    @classmethod
    def __adjustPaletteValue(cls, palette: list):
        """ 调整调色板的明度 """
        newPalette = []
        for rgb in palette:
            h, s, v = cls.rgb2hsv(rgb)

            if v > 0.9:
                factor = 0.8
            elif 0.8 < v <= 0.9:
                factor = 0.9
            elif 0.7 < v <= 0.8:
                factor = 0.95
            else:
                factor = 1

            v *= factor
            newPalette.append(cls.hsv2rgb(h, s, v))

        return newPalette

    @staticmethod
    def rgb2hsv(rgb: tuple) -> tuple:
        """ rgb空间变换到hsv空间 """
        r, g, b = [i / 255 for i in rgb]
        mx = max(r, g, b)
        mn = min(r, g, b)
        df = mx - mn
        if mx == mn:
            h = 0
        elif mx == r:
            h = (60 * ((g - b) / df) + 360) % 360
        elif mx == g:
            h = (60 * ((b - r) / df) + 120) % 360
        elif mx == b:
            h = (60 * ((r - g) / df) + 240) % 360
        s = 0 if mx == 0 else df / mx
        v = mx
        return h, s, v

    @staticmethod
    def hsv2rgb(h, s, v) -> tuple:
        """ hsv空间变换到rgb空间 """
        h60 = h / 60.0
        h60f = floor(h60)
        hi = int(h60f) % 6
        f = h60 - h60f
        p = v * (1 - s)
        q = v * (1 - f * s)
        t = v * (1 - (1 - f) * s)
        r, g, b = 0, 0, 0
        if hi == 0:
            r, g, b = v, t, p
        elif hi == 1:
            r, g, b = q, v, p
        elif hi == 2:
            r, g, b = p, v, t
        elif hi == 3:
            r, g, b = p, q, v
        elif hi == 4:
            r, g, b = t, p, v
        elif hi == 5:
            r, g, b = v, p, q
        r, g, b = int(r * 255), int(g * 255), int(b * 255)
        return r, g, b

    @staticmethod
    def colorfulness(r: int, g: int, b: int):
        rg = np.absolute(r - g)
        yb = np.absolute(0.5 * (r + g) - b)

        rg_mean, rg_std = np.mean(rg), np.std(rg)
        yb_mean, yb_std = np.mean(yb), np.std(yb)

        std_root = np.sqrt(rg_std ** 2 + yb_std ** 2)
        mean_root = np.sqrt(rg_mean ** 2 + yb_mean ** 2)

        return std_root + 0.3 * mean_root

测试

下面是一些图片的测试结果,感觉效果还是挺不错的:

到此这篇关于基于Python实现图片主题色的提取的文章就介绍到这了,更多相关Python主题色提取内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 基于Python实现图片主题色的提取

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

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

猜你喜欢
  • 基于Python实现图片主题色的提取
    目录前言实现流程安装依赖提取主题色测试前言 在 Groove 音乐中,当我们改变歌曲时,底部播放栏的颜色会随专辑封面而变,比如下图中播放栏的颜色变成了 aiko 衣服的颜色。下面我们...
    99+
    2024-04-02
  • CSS获取图片主题色的方法
    这篇文章给大家分享的是有关CSS获取图片主题色的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。背景起因是微信技术群里有个同学发问,有什么方法能够获取图片的主色呢?有一张图片,获取他的主色调:利用获取到的这个颜...
    99+
    2023-06-15
  • Android利用Palette实现提取图片颜色
    目录前言创建Palette提取颜色文字颜色自动适配更多功能总结前言 Palette即调色板这个功能其实很早就发布了,Jetpack同样将这个功能也纳入其中,想要使用这个功能,需要先依...
    99+
    2024-04-02
  • Python基于Pytorch的特征图提取实例
    目录简述单个图片的提取神经网络的构建特征图的提取可视化展示完整代码总结简述 为了方便理解卷积神经网络的运行过程,需要对卷积神经网络的运行结果进行可视化的展示。 大致可分为如下步骤: ...
    99+
    2024-04-02
  • Android怎么用Palette实现提取图片颜色
    本文小编为大家详细介绍“Android怎么用Palette实现提取图片颜色”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android怎么用Palette实现提取图片颜色”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-06-29
  • 如何利用CSS获取图片主题色
    这篇文章将为大家详细讲解有关如何利用CSS获取图片主题色,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。背景起因是微信技术群里有个同学发问,有什么方法能够获取图片的主色呢有...
    99+
    2024-04-02
  • python基于phantomjs实现导入图片
    基于的phantomjs的自动化,会出现 1.flash不支持 2.部分基于view的按钮点不到,部分按钮是基于flash的(尤其是在于上传按钮) browser.find_element_by_xp...
    99+
    2022-06-04
    图片 python phantomjs
  • Python实现提取图片中颜色并绘制成可视化图表
    目录导入模块并加载图片提取颜色并整合成表格绘制图表实战环节今天小编来为大家分享一个有趣的可视化技巧,如何从图片中提取颜色然后绘制成可视化图表,如下图所示 在示例照片当中有着各种各样...
    99+
    2024-04-02
  • JavaScript实现简单获取本地图片主色调
    目录一、实现效果二、实现1、实现思路2、实现代码三、总结与思考一、实现效果 鲜花 大海 森林 二、实现 1、实现思路 其实思路很简单,就是将一张大图先缩小为一张小图,再遍历里面...
    99+
    2023-03-07
    JavaScript获取图片主色调 JavaScript获取图片色调 JavaScript图片色调 JavaScript图片
  • Python提取Word中图片的实现步骤
    目录1.思路2.具体实现2.1导入相关库2.2定义函数2.3重命名word文件,将后缀名docx改为zip2.4zip还原为docx文件,并获得图片的列表2.5将图片复制到需要保存的...
    99+
    2024-04-02
  • 基于Python实现快递信息提取
    目录前言一、思路二、解决方案三、小小花絮四、总结前言 前几天在Python交流群里边,有个叫【^-^】的粉丝分享了一道Python基础的题目,跟快递信息有关的,题目如下: 现在想要...
    99+
    2024-04-02
  • Python基于百度API识别并提取图片中文字
    利用百度 AI 开发平台的 OCR 文字识别 API 识别并提取图片中的文字。首先需注册获取 API 调用的 ID 和 key,步骤如下: 打开百度AI开放平台,进入控制台中的文字识...
    99+
    2024-04-02
  • Python数据获取实现图片数据提取
    目录一、利用exifread提取图片的EXIF信息二、循环遍历图片信息比如我随便从手机上传一张图片到我的电脑里,通过python可以获取这张照片的所有信息。如果是数码相机拍摄的照片,...
    99+
    2024-04-02
  • Python提取PDF中的图片的实现示例
    目录1.导入相关库2.具体实现2.1.使用正则表达式查找PDF中的图片2.2.打印PDF的相关信息2.3.遍历PDF中的对象,遇到是图像才进行下一步,不然就continue2.4.将...
    99+
    2024-04-02
  • Android基于OpenCV实现图像脱色
    目录脱色原理API操作效果源码脱色 Imgproc.cvtColor(rgb, gray, Imgproc.COLOR_RGB2GRAY)可以快速的实现图片脱色,其通过简单的计算将...
    99+
    2024-04-02
  • 基于Python实现图片九宫格切图程序
    目录1、python代码实现图片分割成九宫格2、C++代码实现图片分割成九宫格(附Opencv配置教程)1、python代码实现图片分割成九宫格 需要包含的库,没有下载安装的,需要自...
    99+
    2023-05-15
    Python实现图片九宫格切图 Python图片九宫格切图 Python图片九宫格 Python 九宫格
  • JavaScript如何实现简单获取本地图片主色调
    本篇内容介绍了“JavaScript如何实现简单获取本地图片主色调”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实现1、实现思路其实思路很简...
    99+
    2023-07-05
  • 基于Python制作一款屏幕颜色提取器
    目录1.使用效果2.所需python包3.python小技巧3.1控件数组3.2将控件作为属性3.3怎样重设控件颜色3.4一些用到的字符串操作3.5鼠标位置像素颜色3.6窗口始终置顶...
    99+
    2024-04-02
  • C++基于灰度图上色GrayToColorFromOther的实现
    目录场景需求功能函数代码C++测试代码场景需求        之前有提到给灰度图上色的需求,在此基础上,还有一种需求,就是基于另一张参考灰度图...
    99+
    2024-04-02
  • python 基于AioHttp 异步抓取火星图片
    目录创建aiohttp应用程序 运行应用程序 使用NASA API 获取NASA API密钥 验证图像 总结 翻译:大江狗 原文链接:https://pfertyk.me/2017/...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作