日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于奇异值分解(SVD)的图片压缩实践

發(fā)布時間:2024/7/5 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于奇异值分解(SVD)的图片压缩实践 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1. 前言
    • 2. 原理簡介
      • 2.1 SVD定義
    • 3. 實(shí)踐代碼
    • 4. 參考文獻(xiàn)

1. 前言

數(shù)字圖片在計算機(jī)中是以矩陣形式存儲的。所以可以通過矩陣?yán)碚摵途仃囁惴▽?shù)字圖像進(jìn)行分析和處理。本文通過對圖片進(jìn)行SVD壓縮,對不同的參數(shù)下的壓縮效果進(jìn)行對比。

SVD概念可以參考:《統(tǒng)計學(xué)習(xí)方法》–奇異值分解(Singular Value Decomposition,SVD)

2. 原理簡介

彩色圖片有3個圖層,RGB(紅、綠、藍(lán))也就是矩陣的一個位置上存儲了3個基色的數(shù)值,由3個基色混合成不同的色彩。

通過對3個圖層矩陣,分別進(jìn)行SVD近似,SVD奇異值是唯一的,可以取前 k 個最大的奇異值進(jìn)行近似表達(dá),最后再將3個圖層的矩陣數(shù)據(jù)合并,用較少的數(shù)據(jù)去表達(dá)圖片。

2.1 SVD定義

Am×n=UΣVTUUT=ImVVT=InΣ=diag(σ1,σ2,...,σp)σ1≥σ2≥...≥σp≥0p=min?(m,n)A_{m \times n} = U \Sigma V^T\\ UU^T=I_m\\ VV^T=I_n\\ \Sigma=diag(\sigma_1,\sigma_2,...,\sigma_p) \\ \sigma_1\ge \sigma_2 \ge...\ge\sigma_p \ge0\\ p=\min(m,n)Am×n?=UΣVTUUT=Im?VVT=In?Σ=diag(σ1?,σ2?,...,σp?)σ1?σ2?...σp?0p=min(m,n)

  • UΣVTU \Sigma V^TUΣVT 稱為矩陣 AAA 的奇異值分解(SVD),UUUmmm 階正交矩陣, VVVnnn 階正交矩陣,Σ\SigmaΣm×nm \times nm×n 的對角矩陣
  • σi\sigma_iσi? 稱為矩陣 AAA 的奇異值
  • UUU 的列向量,左奇異向量
  • VVV 的列向量,右奇異向量


Datam×n≈U[:,0:k]Σ[0:k,0:k]VT[0:k,:]Data_{m\times n} \approx U[ : , 0:k] \Sigma[0:k,0:k]V^T[0:k, :]Datam×n?U[:,0:k]Σ[0:k,0:k]VT[0:k,:]

3. 實(shí)踐代碼

# -*- coding:utf-8 -*- # @Python Version: 3.7 # @Time: 2020/4/21 23:38 # @Author: Michael Ming # @Website: https://michael.blog.csdn.net/ # @File: 15.svd_pic_compress.py # @Reference: https://blog.csdn.net/weixin_44344462/article/details/89401727import numpy as np import matplotlib.pyplot as pltdef zip_img_by_svd(img, plotId, rate=0.8):zip_img = np.zeros(img.shape)u_shape = 0sigma_shape = 0vT_shape = 0for chanel in range(3): # 3個圖層u, sigma, v = np.linalg.svd(img[:, :, chanel]) # numpy svd函數(shù)sigma_i = 0temp = 0while (temp / np.sum(sigma)) < rate: # 選取的奇異值和需要達(dá)到設(shè)定的權(quán)重temp += sigma[sigma_i]sigma_i += 1SigmaMat = np.zeros((sigma_i, sigma_i)) # 選取了sigma_i 最大的奇異值for i in range(sigma_i):SigmaMat[i, i] = sigma[i] # 將奇異值填充到Sigma對角矩陣zip_img[:, :, chanel] = u[:, 0:sigma_i].dot(SigmaMat).dot(v[0:sigma_i, :])# 將分解得到的3個矩陣相乘,得到壓縮后的近似矩陣u_shape = u[:, 0:sigma_i].shapesigma_shape = SigmaMat.shapevT_shape = v[0:sigma_i, :].shapefor i in range(3): # 對三個通道的矩陣數(shù)值進(jìn)行歸一化處理MAX = np.max(zip_img[:, :, i])MIN = np.min(zip_img[:, :, i])zip_img[:, :, i] = (zip_img[:, :, i] - MIN) / (MAX - MIN)zip_img = np.round(zip_img * 255).astype("uint8")# 不乘255圖片是黑的(接近0,0,0),數(shù)據(jù)類型uint8plt.imsave("zip_svd_img.jpg", zip_img) # 保存壓縮后的圖片zip_rate = (img.size - 3 * (u_shape[0] * u_shape[1] + sigma_shape[0] * sigma_shape[1] + vT_shape[0] * vT_shape[1])) / (zip_img.size)f = plt.subplot(3, 3, plotId)f.imshow(zip_img)f.set_title("SVD壓縮率 %.4f,奇異值數(shù)量:%d" % (zip_rate, sigma_i))print("設(shè)置的壓縮率:", rate)print("使用的奇異值數(shù)量:", sigma_i)print("原始圖片大小:", img.shape)print("壓縮后用到的矩陣大小:3x({}+{}+{})".format(u_shape, sigma_shape, vT_shape))print("壓縮率為:", zip_rate)if __name__ == '__main__':imgfile = "svd_img.jpg"plt.figure(figsize=(12, 12))plt.rcParams['font.sans-serif'] = 'SimHei' # 消除中文亂碼img = plt.imread(imgfile)f1 = plt.subplot(331) # 繪制子圖,3行3列,3*3個子圖,現(xiàn)在畫第1幅f1.imshow(img)f1.set_title("原始圖片")for i in range(8): # 再畫8個子圖rate = (i + 1) / 10.0 # 壓縮率 10% - 80%zip_img_by_svd(img, i + 2, rate)plt.suptitle('圖片SVD效果對比', fontsize=17, y=0.02) # y偏移距離plt.show()

  • 可以看出在使用128個奇異值的SVD壓縮情況下,就可以得到跟原圖差不多效果的圖片
  • 原圖是703x800的尺寸,SVD使用的矩陣 ((703, 128)+(128, 128)+(128, 800))=208768
  • 可以少使用的矩陣數(shù)據(jù)比例為(703*800*3-208768*3)/(703*800*3)= 62.88%
  • 可以只用37.12%的數(shù)據(jù)量去近似表達(dá)原始圖片,是不是很酷!!!
  • 在網(wǎng)絡(luò)傳輸圖片的過程中,終端用戶可能點(diǎn)擊,也可能不點(diǎn)擊,那我都給他們發(fā)送SVD后的圖片矩陣數(shù)據(jù)(減少了當(dāng)次傳輸數(shù)據(jù)量),然后在終端進(jìn)行矩陣運(yùn)算得到壓縮后的圖片,當(dāng)用戶點(diǎn)擊圖片后,再進(jìn)行傳輸原圖片(1、用戶點(diǎn)擊是分散的,可以降低統(tǒng)一發(fā)送原圖的網(wǎng)絡(luò)擁擠現(xiàn)象;2、有的用戶也不會點(diǎn)擊,就避免了傳輸原圖,達(dá)到了壓縮的目的,節(jié)省流量)
  • 微信收到的圖片、小米手機(jī)云相冊的縮略圖等都可能用到類似的技術(shù)來節(jié)省空間

我是外行,自己想的結(jié)論,不對的地方,請大佬指點(diǎn),感謝!

4. 參考文獻(xiàn)

本文參考了以下兩篇文章,對作者表示感謝!

  • 利用SVD進(jìn)行圖像壓縮(附Python代碼)
  • 用SVD壓縮圖像

總結(jié)

以上是生活随笔為你收集整理的基于奇异值分解(SVD)的图片压缩实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。