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

目录
  • 前言
  • 实现流程
    • 安装依赖
    • 提取主题色
  • 测试

前言

在 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主题色提取内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 利用Python提取图片经纬度并锁定拍照地点

    目录 一.原理 1.图片必须具有经纬度信息 2.经纬度格式转换 3.根据经纬度定位 二.python调用高德API进行图片定位 1.main.py源码 2.position_utils.py源码 一.原理 1.图片必须具有经纬度信息 2.经纬度格式转换 2.1 GPS点坐标的两种表示方式(误差还是有的) 2.1.1 十进制换度分秒 例:经纬度115.46513298108795,38.83474699749353 2.1.2 度分秒换十进制 2.1.3 实际距离换算 地球子午线长是39940.6

  • python批量提取图片信息并保存的实现

    程序运行环境 code # -*- coding:utf-8 -*- # ----------------------------------- # @Time : 2021/2/3 9:23 # @Author : HaoWu # @File : OutPixel.py # ------------------------------------ import sys import os from glob import glob from PIL import Image sys.path.

  • python-opencv颜色提取分割方法

    1.用于简单的对象检测.跟踪 2.简单前背景分割 #encoding:utf-8 #黄色检测 import numpy as np import argparse import cv2 image = cv2.imread('huang.png') color = [ ([0, 70, 70], [100, 255, 255])#黄色范围~这个是我自己试验的范围,可根据实际情况自行调整~注意:数值按[b,g,r]排布 ] #如果color中定义了几种颜色区间,都可以分割出来 for (lower

  • Python Opencv提取图片中某种颜色组成的图形的方法

    主要目标识别图中红色的裂缝,尝试了几种不同的方法,最后发现比较每一点的RGB差值可以很好的解决这个问题,也就是提取图片中的红色相关信息.处理结果如下: 实现的代码如下,注意opencv读入的图片通道顺序是bgr: import cv2 import matplotlib.pyplot as plt imagepath = r'tear/11.jpg' image = cv2.imread(imagepath) height,width,channel = image.shape for i in

  • 基于Python制作一款屏幕颜色提取器

    目录 1.使用效果 2.所需python包 3.python小技巧 3.1控件数组 3.2将控件作为属性 3.3怎样重设控件颜色 3.4一些用到的字符串操作 3.5鼠标位置像素颜色 3.6窗口始终置顶 3.7文本框不允许编辑但允许复制 4.完整代码 1.使用效果 如下面动图所示,点击取色按钮后,将鼠标移动到想要取色的位置,等待两秒即可取色: 点击save color按钮可以将颜色存储到color library区域,同时如图所示, ! ! ! !红框内所有的方形元件其实都是按钮,点击后能获得颜色

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

    目录 前言 实现流程 安装依赖 提取主题色 测试 前言 在 Groove 音乐中,当我们改变歌曲时,底部播放栏的颜色会随专辑封面而变,比如下图中播放栏的颜色变成了 aiko 衣服的颜色.下面我们会在 python 中实现相同的效果,也就是提取出图片中的主题色. 实现流程 安装依赖 提取主题色有很多方法,比如使用 k-means 聚类,选出 k 个 RGB 坐标的聚类中心,但是速度会差一些,我们这里换成中位切分法.已经有人为我们实现好这个算法了,我们可以拿来就用. pip install colo

  • 如何基于Python获取图片的物理尺寸

    这篇文章主要介绍了如何基于Python获取图片的物理尺寸,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 问题 如何获取图片的物理尺寸,而非(width, height)? 代码 以女神图为例 #! -*- coding: utf-8 -*- import requests import io url = "http://s1.sinaimg.cn/large/001Db1PVzy7qxVQWMjs06" image = request

  • 基于Python实现图片九宫格切图程序

    目录 1.python代码实现图片分割成九宫格 2.C++代码实现图片分割成九宫格(附Opencv配置教程) 1.python代码实现图片分割成九宫格 需要包含的库,没有下载安装的,需要自己安装哦. 实现原理很简单,就是用PIL库不断画小区域,切下来存储成新的小图片. 假设每一个格子的宽和高分别是w.h,那么第row行(从0开始计数),第col列(从0开始计数)的格子左上角坐标和右下角坐标分别是(col * w, row * h),(col * w + w, r * h + h). 代码实例:

  • 基于Python实现图片一键切割九宫格的工具

    有时候发微博时候,需要裁切图片为九宫格,但是ps或者其他工具都太麻烦,这里写一个python一键切割九宫格的工具,以供大家学习和使用! 实现代码 """ 1.将一张图片填充为正方形 2.将文字加到方形图片上 3.讲图片切为9张图并存储 """ import os from tkinter import filedialog from PIL import Image from future.moves import tkinter # 填充文字的

  • 基于python的图片修复程序(实现水印去除)

    图片修复程序-可用于水印去除 在现实的生活中,我们可能会遇到一些美好的或是珍贵的图片被噪声干扰,比如旧照片的折痕,比如镜头上的灰尘或污渍,更或者是某些我们想为我所用但有讨厌水印,那么有没有一种办法可以消除这些噪声呢? 答案是肯定的,依然是被我们用了无数次的OpenCV这款优秀的框架. OpenCV 目前,OpenCV逐步成为一个通用的基础研究和产品开发平台.OpenCV这一名称包含了Open和 Computer Vision两者的意思.实际上,Open指Open Source(开源,即开放源代码

  • 基于python实现图片转字符画代码实例

    直接上代码图片就使用我家爽妹子的吧 如果没有安装pil模块的话先cmd安装下 输入:pip install pillow # -*- coding: utf-8 -*- from PIL import Image codeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'. '''#生成字符画所需的字符集 count = len(codeLib) def transform1

  • Python实现图片格式转换小程序

    基于Python实现图片格式转换的小程序,供大家参考,具体内容如下 特点: 1.批量处理图片2.转换常见的4种图片格式 运行窗口 运行窗口-1 选择图片(可批量选择)-2 假设选中4张JEPG格式的图片 格式选择窗口-3 假设选择目标格式PNG 结束窗口-4 结果展示-5 可以发现4个JEPG目标图片成功转换为PNG格式的图片 代码 import tkinter as tk import tkinter.messagebox from tkinter import filedialog from

  • 利用python编写一个图片主色转换的脚本

    前言 最近由于项目特需老是替换主题颜色,同时app里一些资源icon图片主色也要改,美工不提供切图只能靠自己了,开始想在iconfont上面找但是数量比较多太浪费时间,然后就想到python的Pillow在图像处理方便很强大. Pillow是Python里的图像处理库(PIL:Python Image Library),提供了了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存.图像显示.格式转换以及基本的图像处理操作等. 本文就编写了一个批量替换图片主色的脚本changeImageCol

  • 基于Python实现PDF区域文本提取工具

    目录 功能简介 开发代码 功能简介 打开软件后界面如下: 点击打开文件按钮打开之前的PDF文件后效果如下: 框选区域后,标题栏会自动显示当前框选的区域提取到的文字,还可以左右按钮切换: 实际我们需要提取文字的区域可能不止这一个,所以程序支持多区域框选: 完成区域框选后就可以点击保存文件,将PDF每页提取到的文本保存到一个csv文件中,当前选区的保存结果如下: 可以看到已经按框选顺序依次保存了每一个区域的字符串. 如果选择区域时发现提取结果不准确,可以撤销后重新选择: 保存图片则会将PDF的每页的

随机推荐