K-Means顏色變卦和漸變色

一、理論深度提升:補充算法細節與數學基礎

1.?K-Means 算法核心公式(增強專業性)

在 “原理步驟” 中加入數學表達式,說明聚類目標:
K-Means 的目標是最小化簇內平方和(Within-Cluster Sum of Squares, WCSS):J=∑i=1K?∑x∈Ci??∥x?μi?∥2
其中,Ci??是第?i?個簇,μi??是簇中心。算法通過迭代更新簇中心?μi??和分配樣本到最近中心,逐步優化?J。

2.?顏色空間選擇(擴展知識邊界)

新增小節說明 RGB 顏色空間的局限性,推薦更適合聚類的顏色空間(如 Lab):

  • RGB:各通道高度相關,歐氏距離不能準確反映視覺差異。
  • Lab:基于人眼感知,通道獨立,聚類效果更符合視覺預期(可補充代碼示例,需安裝colorama庫)。

?

二、K-Means 顏色聚類(K-Means Color Clustering)

1.概念與作用

K-Means 顏色聚類是借助?K-Means 聚類算法?對圖像(或顏色集合)中的顏色進行分組,目的是提取出最具代表性的若干種顏色(聚類中心),實現顏色簡化或風格化。比如:

1)簡化圖像色彩:把照片的上百種顏色壓縮為 5 - 10 種主色,生成類似插畫、低多邊形藝術的效果。

2)色彩分析:快速找出圖像里占比高的顏色,用于設計配色參考、圖像分類(如區分風景照的 “暖色調”“冷色調” )。

2.原理步驟

1)數據準備:把圖像的每個像素(RGB 形式,如?(r, g, b)?)視為高維空間(3 維,對應 RGB 通道)中的點。

2)聚類分組:用 K-Means 算法將這些點聚成?K?類(K?是你設定的聚類數,比如 5 類就提取 5 種主色 )。算法隨機選?K?個初始中心,不斷迭代調整,讓同類點盡可能靠近自己的中心,不同類中心盡可能遠離。

3)顏色替換:用每個聚類的中心顏色,替換該類所有像素的顏色。最終圖像就只剩?K?種主色,實現色彩簡化。

代碼:(使用的時候記得修改圖片路徑)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from matplotlib.image import imreaddef set_chinese_font():"""設置 Matplotlib 支持中文顯示的字體"""import matplotlib.font_manager as fmchinese_fonts = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC", "Microsoft YaHei"]available_fonts = [f.name for f in fm.fontManager.ttflist]for font in chinese_fonts:if font in available_fonts:plt.rcParams["font.family"] = fontprint(f"已設置中文字體: {font}")return Trueprint("警告: 未找到可用的中文字體,圖表中的中文可能顯示為方塊")return False# 設置中文字體
set_chinese_font()
image_path = r"D:\keshihua\biancheng\PythonProject1\haimianbaobao.jpg"  
try:image = imread(image_path)if image.shape[-1] == 4:image = image[..., :3]print(f"圖像加載成功,尺寸: {image.shape}")
except FileNotFoundError:print("錯誤:圖片路徑不存在,請檢查路徑!")exit(1)
except Exception as e:print(f"加載圖片失敗: {e}")exit(1)n_clusters = 5  
pixels = image.reshape(-1, 3)  kmeans = KMeans(n_clusters=n_clusters, random_state=42, n_init='auto')
kmeans.fit(pixels)if image.dtype == np.uint8:main_colors = kmeans.cluster_centers_.astype(np.uint8)
else:main_colors = kmeans.cluster_centers_
main_colors = main_colors.reshape(-1, 3)plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title("原始圖像")
plt.axis('off')plt.subplot(1, 2, 2)
color_width = 1 / n_clusters  
for i in range(n_clusters):plt.fill_between(x=[i * color_width, (i + 1) * color_width],y1=0, y2=1,color=main_colors[i] / 255.0 if image.dtype == np.uint8 else main_colors[i],edgecolor='white')
plt.axis('off')
plt.title(f"提取的 {n_clusters} 種主色")plt.tight_layout()
plt.show()print("提取的主色 (RGB 數值):")
for i, color in enumerate(main_colors):if image.dtype == np.uint8:print(f"主色 {i+1}: {color}")else:print(f"主色 {i+1}: {color.round(3)}")

運行結果:

三、漸變色(Gradient Color)

1.概念與作用

漸變色是指?兩種或多種顏色之間平滑過渡的色彩效果?,能營造柔和、連貫的視覺感受。結合 K-Means 顏色聚類,常用來:

1)可視化聚類結果:用聚類得到的主色,生成從一種主色平滑過渡到另一種主色的色帶,直觀展示 “提取了哪些主色” 。

2)設計配色方案:基于圖像主色,快速生成協調的漸變色,用于 UI 設計、海報背景等。

2.實現方式:

1)提取主色:先用 K-Means 聚類得到?K?個主色(聚類中心)。

2)創建漸變映射:用?LinearSegmentedColormap(Matplotlib 工具),把主色按順序排列,讓顏色在色帶中平滑過渡。

3)生成漸變圖像:用創建好的顏色映射,生成從左到右(或其他方向)的漸變色帶。

代碼:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from matplotlib.image import imread
from matplotlib.colors import LinearSegmentedColormap# 設置中文字體
def set_chinese_font():import matplotlib.font_manager as fmchinese_fonts = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC", "Microsoft YaHei"]available_fonts = [f.name for f in fm.fontManager.ttflist]for font in chinese_fonts:if font in available_fonts:plt.rcParams["font.family"] = fontprint(f"已設置中文字體: {font}")return Trueprint("警告: 未找到可用的中文字體,圖表中的中文可能顯示為方塊")return Falseset_chinese_font()image_path = r"D:\keshihua\biancheng\PythonProject1\haimianbaobao.jpg"
try:image = imread(image_path)if image.shape[-1] == 4:image = image[..., :3]print(f"圖像加載成功,尺寸: {image.shape}")
except Exception as e:print(f"加載圖片失敗: {e}")exit(1)n_clusters = 5  # 可調整聚類數量
pixels = image.reshape(-1, 3)kmeans = KMeans(n_clusters=n_clusters, random_state=42, n_init='auto')
kmeans.fit(pixels)if image.dtype == np.uint8:main_colors = kmeans.cluster_centers_.astype(np.uint8)
else:main_colors = kmeans.cluster_centers_
main_colors = main_colors.reshape(-1, 3)# 歸一化顏色到 [0,1] 范圍
main_colors_normalized = main_colors / 255.0 if image.dtype == np.uint8 else main_colors# 創建漸變色映射(按聚類中心順序過渡)
cmap = LinearSegmentedColormap.from_list('custom_gradient', main_colors_normalized, N=200)# 生成水平漸變色條
gradient = np.linspace(0, 1, 500).reshape(1, -1)  # 500 個漸變點
gradient_image = cmap(gradient)[0, :, :3]  # 提取 RGB 值plt.figure(figsize=(14, 8))# 子圖 1:原始圖像
plt.subplot(2, 2, 1)
plt.imshow(image)
plt.title("原始圖像")
plt.axis('off')# 子圖 2:主色提取(色塊形式)
plt.subplot(2, 2, 2)
color_width = 1 / n_clusters
for i in range(n_clusters):plt.fill_between(x=[i * color_width, (i + 1) * color_width],y1=0, y2=1,color=main_colors_normalized[i],edgecolor='white',linewidth=1)# 添加顏色標簽plt.text((i * color_width + (i + 1) * color_width) / 2,0.5,f"#{i+1}",ha='center',va='center',color='white' if np.mean(main_colors_normalized[i]) < 0.5 else 'black',fontweight='bold')
plt.axis('off')
plt.title(f"提取的 {n_clusters} 種主色")# 子圖 3:漸變色條(水平)
plt.subplot(2, 1, 2)
plt.imshow(gradient_image.reshape(1, -1, 3), aspect='auto')
plt.title("主色之間的平緩過渡")
plt.axis('off')# 添加主色標記點(修復顏色格式問題)
for i in range(n_clusters):pos = i / (n_clusters - 1) if n_clusters > 1 else 0.5  # 計算位置plt.plot([pos * 499], [0], 'wo', markersize=8, markeredgecolor='black')  # 白色圓點# 修復:使用 tuple 格式傳遞顏色,而不是字符串plt.plot([pos * 499], [0], 'o', color=tuple(main_colors_normalized[i]), markersize=5)plt.tight_layout()
plt.show()print("提取的主色 (RGB 數值):")
for i, color in enumerate(main_colors):rgb_str = f"RGB({color[0]:3d}, {color[1]:3d}, {color[2]:3d})"hex_str = '#{:02x}{:02x}{:02x}'.format(*color) if image.dtype == np.uint8 else ''print(f"主色 #{i+1}: {rgb_str} {hex_str if hex_str else ''}")

原圖:

四、常見問題與優化策略(提升實用性)

1.?如何選擇最優 K 值?

新增小節介紹肘部法則(Elbow Method),通過 WCSS 曲線確定最佳聚類數:

?

# 計算不同K值的WCSS
wcss = []
for k in range(2, 10):kmeans = KMeans(k, random_state=42).fit(pixels)wcss.append(kmeans.inertia_)# 繪制肘部曲線
plt.plot(range(2, 10), wcss, 'bo-')
plt.xlabel("聚類數 K")
plt.ylabel("WCSS")
plt.title("肘部法則確定最優K值")
2.?聚類結果不穩定怎么辦?

建議:

  • 增加n_init參數(如n_init=10),重復初始化多次取最優。
  • 使用層次聚類(Hierarchical Clustering)作為預聚類,提供更穩定的初始中心。

?

3.?對比其他顏色聚類算法

新增表格對比 K-Means 與其他算法的優缺點:

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84346.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84346.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84346.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入解析C#表達式求值:優先級、結合性與括號的魔法

—— 為什么2/6*4不等于1/12&#xff1f; &#x1f50d; 一、表達式求值順序為何重要&#xff1f; 表達式如精密儀器&#xff0c;子表達式求值順序直接決定結果。例如&#xff1a; int result 3 * 5 2;若先算乘法&#xff1a;(3*5)2 17 ?若先算加法&#xff1a;3*(52)21…

Docker 離線安裝指南

參考文章 1、確認操作系統類型及內核版本 Docker依賴于Linux內核的一些特性&#xff0c;不同版本的Docker對內核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux內核3.10及以上版本&#xff0c;Docker17.09及更高版本對應Linux內核4.9.x及更高版本。…

Spring——Spring相關類原理與實戰

摘要 本文深入探討了 Spring 框架中 InitializingBean 接口的原理與實戰應用&#xff0c;該接口是 Spring 提供的一個生命周期接口&#xff0c;用于在 Bean 屬性注入完成后執行初始化邏輯。文章詳細介紹了接口定義、作用、典型使用場景&#xff0c;并與其他相關概念如 PostCon…

Angular微前端架構:Module Federation + ngx-build-plus (Webpack)

以下是一個完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 實現了主應用&#xff08;Shell&#xff09;與子應用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;? 項目結構 angular-mf/ ├── shell-app/ # 主應用&…

ESP32 I2S音頻總線學習筆記(四): INMP441采集音頻并實時播放

簡介 前面兩期文章我們介紹了I2S的讀取和寫入&#xff0c;一個是通過INMP441麥克風模塊采集音頻&#xff0c;一個是通過PCM5102A模塊播放音頻&#xff0c;那如果我們將兩者結合起來&#xff0c;將麥克風采集到的音頻通過PCM5102A播放&#xff0c;是不是就可以做一個擴音器了呢…

馮諾依曼架構是什么?

馮諾依曼架構是什么&#xff1f; 馮諾依曼架構&#xff08;Von Neumann Architecture&#xff09;是現代計算機的基礎設計框架&#xff0c;由數學家約翰馮諾依曼&#xff08;John von Neumann&#xff09;及其團隊在1945年提出。其核心思想是通過統一存儲程序與數據&#xff0…

【持續更新】linux網絡編程試題

問題1 請簡要說明TCP/IP協議棧的四層結構&#xff0c;并分別舉出每一層出現的典型協議或應用。 答案 應用層&#xff1a;ping,telnet,dns 傳輸層&#xff1a;tcp,udp 網絡層&#xff1a;ip,icmp 數據鏈路層&#xff1a;arp,rarp 問題2 下列協議或應用分別屬于TCP/IP協議…

橢圓曲線密碼學(ECC)

一、ECC算法概述 橢圓曲線密碼學&#xff08;Elliptic Curve Cryptography&#xff09;是基于橢圓曲線數學理論的公鑰密碼系統&#xff0c;由Neal Koblitz和Victor Miller在1985年獨立提出。相比RSA&#xff0c;ECC在相同安全強度下密鑰更短&#xff08;256位ECC ≈ 3072位RSA…

【JVM】- 內存結構

引言 JVM&#xff1a;Java Virtual Machine 定義&#xff1a;Java虛擬機&#xff0c;Java二進制字節碼的運行環境好處&#xff1a; 一次編寫&#xff0c;到處運行自動內存管理&#xff0c;垃圾回收的功能數組下標越界檢查&#xff08;會拋異常&#xff0c;不會覆蓋到其他代碼…

React 基礎入門筆記

一、JSX語法規則 1. 定義虛擬DOM時&#xff0c;不要寫引號 2.標簽中混入JS表達式時要用 {} &#xff08;1&#xff09;.JS表達式與JS語句&#xff08;代碼&#xff09;的區別 &#xff08;2&#xff09;.使用案例 3.樣式的類名指定不要用class&#xff0c;要用className 4.內…

Linux鏈表操作全解析

Linux C語言鏈表深度解析與實戰技巧 一、鏈表基礎概念與內核鏈表優勢1.1 為什么使用鏈表&#xff1f;1.2 Linux 內核鏈表與用戶態鏈表的區別 二、內核鏈表結構與宏解析常用宏/函數 三、內核鏈表的優點四、用戶態鏈表示例五、雙向循環鏈表在內核中的實現優勢5.1 插入效率5.2 安全…

SQL進階之旅 Day 19:統計信息與優化器提示

【SQL進階之旅 Day 19】統計信息與優化器提示 文章簡述 在數據庫性能調優中&#xff0c;統計信息和優化器提示是兩個至關重要的工具。統計信息幫助數據庫優化器評估查詢成本并選擇最佳執行計劃&#xff0c;而優化器提示則允許開發人員對優化器的行為進行微調。本文深入探討了…

安寶特方案丨船舶智造AR+AI+作業標準化管理系統解決方案(維保)

船舶維保管理現狀&#xff1a;設備維保主要由維修人員負責&#xff0c;根據設備運行狀況和維護計劃進行定期保養和故障維修。維修人員憑借經驗判斷設備故障原因&#xff0c;制定維修方案。 一、痛點與需求 1 Arbigtec 人工經驗限制維修效率&#xff1a; 復雜設備故障的診斷和…

MFC內存泄露

1、泄露代碼示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 獲取 Ribbon Bar 指針// 創建自定義按鈕CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…

基于區塊鏈的供應鏈溯源系統:構建與實踐

前言 在當今全球化的經濟環境中&#xff0c;供應鏈的復雜性不斷增加&#xff0c;商品從原材料采購到最終交付給消費者的過程涉及多個環節和眾多參與者。如何確保供應鏈的透明度、可追溯性和安全性&#xff0c;成為企業和消費者關注的焦點。區塊鏈技術以其去中心化、不可篡改和透…

Web攻防-SQL注入數據格式參數類型JSONXML編碼加密符號閉合

知識點&#xff1a; 1、Web攻防-SQL注入-參數類型&參數格式 2、Web攻防-SQL注入-XML&JSON&BASE64等 3、Web攻防-SQL注入-數字字符搜索等符號繞過 案例說明&#xff1a; 在應用中&#xff0c;存在參數值為數字&#xff0c;字符時&#xff0c;符號的介入&#xff0c…

探秘鴻蒙 HarmonyOS NEXT:實戰用 CodeGenie 構建鴻蒙應用頁面

在開發鴻蒙應用時&#xff0c;你是否也曾為一個頁面的布局反復調整&#xff1f;是否還在為查 API、寫模板代碼而浪費大量時間&#xff1f;今天帶大家實戰體驗一下鴻蒙官方的 AI 編程助手——CodeGenie&#xff08;代碼精靈&#xff09; &#xff0c;如何從 0 到 1 快速構建一個…

DBAPI如何優雅的獲取單條數據

API如何優雅的獲取單條數據 案例一 對于查詢類API&#xff0c;查詢的是單條數據&#xff0c;比如根據主鍵ID查詢用戶信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默認返回的數據格式是多條的&#xff0c;如下&#xff1a; {&qu…

使用Whisper本地部署實現香港版粵語+英語混合語音轉文字方案

今天要一個非常好的朋友有個工作&#xff0c;就是要把醫院醫生診斷的說話記錄轉成文字&#xff0c;之前都是她本人一句一句的聽&#xff0c;然后記錄下來的&#xff0c;我想通過ai 來解決這個問題。 她的需求如下&#xff1a; 不能把數據傳到網上&#xff0c;隱私問題所以需要…

案例分享--汽車制動卡鉗DIC測量

制動系統是汽車的主要組成部分&#xff0c;是汽車的主要安全部件之一。隨著車輛性能的不斷提高&#xff0c;車速不斷提升&#xff0c;對車輛的制動系統也隨之提出了更高要求&#xff0c;因此了解車輛制動系統中每個部件的動態行為成為了制動系統優化的主要途徑&#xff0c;同時…