前文我們了解了奇異值分解(SVD)的原理拼岳,今天就實(shí)戰(zhàn)一下窿给,用矩陣的奇異值分解對(duì)圖片進(jìn)行壓縮.
Learn by doing
我做了一個(gè)在線的圖像壓縮應(yīng)用,大家可以感受一下帆赢。
https://huggingface.co/spaces/beihai/Image-Compression-with-SVD
功能很簡(jiǎn)單茶敏,上傳需要壓縮的圖片壤靶,選擇壓縮比,提交即可惊搏。
[圖片上傳失敗...(image-30f28b-1650179510896)]
下面咱們就一起看看實(shí)現(xiàn)過(guò)程
用SVD壓縮圖像
[圖片上傳失敗...(image-ef6049-1650179510896)]
[圖片上傳失敗...(image-98d87-1650179510896)]
原理很簡(jiǎn)單:
將圖片分解為RGB三顏色矩陣贮乳,將每個(gè)顏色矩陣進(jìn)行奇異值分解,然后選擇指定數(shù)量的特征對(duì)矩陣進(jìn)行壓縮恬惯。
核心代碼
完整代碼大家可以clone我的huggingface
https://huggingface.co/spaces/beihai/Image-Compression-with-SVD
核心代碼1:
p表示奇異值的百分比向拆,根據(jù)指定的清晰度提取奇異值清晰度越高,壓縮比越低酪耳,提取的奇異值的個(gè)數(shù)也就越多亲铡,圖片也就越不會(huì)失真)
def rebuild_img(u, sigma, v, percent):
m = len(u)
n = len(v)
a = np.zeros((m, n))
count = (int)(sum(sigma))
curSum = 0
k = 0
while curSum <= count * percent:
uk = u[:, k].reshape(m, 1)
vk = v[k].reshape(1, n)
a += sigma[k] * np.dot(uk, vk)
curSum += sigma[k]
k += 1
a[a < 0] = 0
a[a > 255] = 255
核心代碼2:
主要就是定義inderence函數(shù)和gradio前端的實(shí)現(xiàn)
import os
os.system("pip install --upgrade pip")
os.system("pip install opencv-python-headless")
import cv2
import numpy as np
import gradio as gr
from func import rebuild_img
def inference(img,k):
input_img = cv2.imread(img, cv2.IMREAD_COLOR)
u, sigma, v = np.linalg.svd(input_img[:, :, 0])
R = rebuild_img(u, sigma, v, k)
u, sigma, v = np.linalg.svd(input_img[:, :, 1])
G = rebuild_img(u, sigma, v, k)
u, sigma, v = np.linalg.svd(input_img[:, :, 2])
B = rebuild_img(u, sigma, v, k)
restored_img = np.stack((R, G, B), 2)
return Image.fromarray(restored_img[:, :, ::-1])
gr.Interface(
inference,
[
gr.inputs.Image(type="filepath", label="Input"),gr.inputs.Slider(0, 1, 0.1,default=0.6,label= 'Compression ratio')],
gr.outputs.Image(type="pil", label="Output"),
title=title,
description=description,
article=article
).launch(enable_queue=True,cache_examples=True,share=True)
上線
Gradio + Huggingface 上線機(jī)器學(xué)習(xí)應(yīng)用(純免費(fèi))我已經(jīng)介紹過(guò)很多遍了,這里就不贅述了,還不太熟悉的同學(xué)請(qǐng)移步我這篇文章:騰訊的這個(gè)算法奖蔓,我搬到了網(wǎng)上,隨便玩讹堤!
這里就提一下遇到的小問(wèn)題及解決方法吧吆鹤。
由于用了cv2,所以要安裝opencv-python洲守,但是運(yùn)行中報(bào)錯(cuò)如下:
File "/home/user/.local/lib/python3.8/site-packages/cv2/__init__.py", line 8, in <module>
from .cv2 import *
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
針對(duì)這個(gè)錯(cuò)誤疑务,網(wǎng)上有以下方法:
1 yum安裝:
yum install libglvnd-glx
2 重新安裝opencv包:
pip uninstall opencv-python
pip install opencv-python-headless
第一種方法需要root權(quán)限,建議直接第二種方法吧梗醇,省事缸逃。