<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在 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主題色提取內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45