图片SVD-python code

本文介绍了一种使用奇异值分解(SVD)进行图像压缩的方法。通过将图像转换为矩阵,应用SVD,然后根据奇异值的百分比重建图像,实现了有效的图像数据压缩。实验中,对彩色图像的不同颜色通道分别进行了SVD处理,展示了如何通过调整保留的奇异值数量来控制压缩比率和图像质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#svd
from PIL import Image
import numpy as np
def rebuild_img(u, sigma, v, p): #p表示奇异值的百分比
    m = len(u)
    n = len(v)
    A=np.zeros((m,n))
    for i in range(int(len(sigma)*p)):
        #print(i)
        A[i,i]=sigma[i]
        #print(A)
    a=np.dot(np.dot(u,A),v)
    
    a[a < 0] = 0
    a[a > 255] = 255
    #按照最近距离取整数,并设置参数类型为uint8
    return np.rint(a).astype("uint8")

if __name__ == '__main__':
    img = Image.open('C:/Users/van/Pictures/Saved Pictures/1.jpg', 'r')
    a = np.array(img)
    u, sigma, v = np.linalg.svd(a[:, :, 0])
    print(np.array(sigma).shape)
    print(np.array(u).shape)
    print(np.array(v).shape)
    for p in np.arange(0.01, 0.1, 0.01):
        u, sigma, v = np.linalg.svd(a[:, :, 0])
        R = rebuild_img(u, sigma, v, p)

        u, sigma, v = np.linalg.svd(a[:, :, 1])
        G = rebuild_img(u, sigma, v, p)

        u, sigma, v = np.linalg.svd(a[:, :, 2])
        B = rebuild_img(u, sigma, v, p)

        I = np.stack((R, G, B), 2)
        #保存图片在img文件夹下
        Image.fromarray(I).save("C:/Users/van/Pictures/Saved Pictures/svd_" + str(p * 100) + ".jpg")

 

 

reference:https://blog.youkuaiyun.com/xuelabizp/article/details/52318708

### K-SVD重构算法的Python实现 #### 环境准备 为了顺利运行K-SVD重构算法,需安装必要的Python包。主要依赖于`numpy`用于数值运算以及`scipy`提供科学计算功能。 ```bash pip install numpy scipy matplotlib ``` #### 数据初始化与预处理 在执行K-SVD之前,通常先加载并标准化待处理的数据集。这里以图像去噪为例说明: ```python import numpy as np from skimage import data, img_as_float from skimage.util import random_noise from sklearn.preprocessing import normalize def prepare_data(image_path=None): """Prepare noisy image.""" if not image_path: # Use default test image from scikit-image library. original = img_as_float(data.camera()) else: raise NotImplementedError("Custom image loading is not implemented.") sigma = 0.155 noisy_image = random_noise(original, var=sigma**2) return original, noisy_image ``` #### 构建字典学习模型 定义函数来创建初始字典D,并通过迭代更新字典和稀疏表示X直到收敛为止。 ```python from scipy.sparse.linalg import lsqr class KSVD(object): def __init__(self, n_components, max_iter=10, tol=1e-6, transform_n_nonzero_coefs=None): self.n_components = n_components self.max_iter = max_iter self.tol = tol self.transform_n_nonzero_coefs = transform_n_nonzero_coefs def _update_dict(self, phi, Y, Z): for i in range(self.n_components): index_set = (Z[:,i]!=0).nonzero()[0] if len(index_set)==0: continue psi_i = phi[index_set,:].T @ Y[index_set,:] / \ ((phi[index_set,i])**2).sum() r = Y - Z@psi_i.reshape(-1,1) u,s,vh=np.linalg.svd(r.T@r)[::-1][:3] phi[:,i]=u[:,0]; psi_i=vectors[0]/s[0] return phi def fit_transform(self, X): m,n=X.shape; p=self.n_components; D_init = np.random.randn(n,p); D=D_init.copy(); sparse_code = np.zeros((m,p)) for iteration in range(self.max_iter): prev_D = D.copy() # Sparse coding step using OMP or any other method for j in range(m): residual = X[j]-sparse_code[j]@(D.T) idx = abs(D.T@residual).argmax() sparse_code[j,idx]+=np.sign(residual[idx])*(abs(D.T@residual)).max() D = self._update_dict(D,X,sparse_code) change_rate=(prev_D-D)**2/(prev_D**2+1e-9).mean(axis=0) if all(change_rate<self.tol): break return D, sparse_code ``` 此部分实现了基本框架下的KSVD类[^2][^3]。 #### 应用实例:图像去噪效果展示 最后一步是应用上述训练好的字典对含噪声图片进行恢复操作。 ```python if __name__ == "__main__": orig_img, noised_img = prepare_data() ks = KSVD(256,max_iter=5,tol=1E-4,) dictionary,_ = ks.fit_transform(noised_img.flatten().reshape((-1,1))) reconstructed_signal = ... # Complete this line with reconstruction logic based on the learned dictionary and coefficients. fig, axes = plt.subplots(ncols=3, figsize=(8, 3), sharex=True, sharey=True) ax = axes.ravel() ax[0].imshow(orig_img, cmap='gray') ax[0].set_title('Original Image') ax[1].imshow(noised_img, cmap='gray') ax[1].set_title('Noisy Image') ax[2].imshow(reconstructed_signal.reshape(orig_img.shape),cmap='gray') ax[2].set_title('Reconstructed Image') plt.tight_layout() plt.show() ``` 这段代码展示了如何使用自定义的KSVD对象去除图像中的随机噪声。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值