在Python中使用K-Means聚類和PCA主成分分析進行圖像壓縮


 

各位讀者好,在這片文章中我們嘗試使用sklearn庫比較k-means聚類算法和主成分分析(PCA)在圖像壓縮上的實現和結果。 壓縮圖像的效果通過占用的減少比例以及和原始圖像的差異大小來評估。 圖像壓縮的目的是在保持與原始圖像的相似性的同時,使圖像占用的空間盡可能地減小,這由圖像的差異百分比表示。 圖像壓縮需要幾個Python庫,如下所示:

# image processing
from PIL import Image
from io import BytesIO
import webcolors

# data analysis
import math
import numpy as np
import pandas as pd

# visualization
import matplotlib.pyplot as plt
from importlib import reload
from mpl_toolkits import mplot3d
import seaborn as sns

# modeling
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.preprocessing import MinMaxScaler

探索圖像

每個顏色通道的圖像
圖像中的每個像素都可以表示為三個0到255之間的8位無符號(正)整數,或縮放為三個0到1之間的無符號(正)浮點數。這三個值分別指定紅色,綠色,藍色的強度值,這通常稱為RGB編碼。 在此文章中,我們使用了220 x 220像素的lena.png,這是在圖像處理領域廣泛使用的標准測試圖像。

ori_img = Image.open("images/lena.png")
ori_img

原始圖像

X = np.array(ori_img.getdata())
ori_pixels = X.reshape(*ori_img.size, -1)
ori_pixels.shape

圖像儲存方式是形狀為(220、220、3)的3D矩陣。 前兩個值指定圖像的寬度和高度,最后一個值指定RBG編碼。 讓我們確定圖像的其他屬性,即圖像大小(以千字節(KB)為單位)和原色的數量。

def imageByteSize(img):
    img_file = BytesIO()
    image = Image.fromarray(np.uint8(img))
    image.save(img_file, 'png')
    return img_file.tell()/1024
ori_img_size = imageByteSize(ori_img)
ori_img_n_colors = len(set(ori_img.getdata()))

lena.png的原始圖像大小為86 KB,並具有37270種獨特的顏色。 因此,我們可以說lena.png中的兩個像素具有相同的精確RGB值的可能性很小。

接下來,讓我們計算圖像的差異作為壓縮結果的基准。

ori_img_total_variance = sum(np.linalg.norm(X - np.mean(X, axis = 0), axis = 1)**2)

我們得到方差為302426700.6427498。 但是我們無法解釋方差本身的價值。 我們稍后將在K-Means聚類中使用它。

 

 

完整內容請訪問:https://imba.deephub.ai/p/3e37ea307a2211ea90cd05de3860c663

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM