码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 机器学习实战:用SVD压缩图像


    前文我们了解了奇异值分解(SVD)的原理,今天就实战一下,用矩阵的奇异值分解对图片进行压缩.

    Learn by doing

    我做了一个在线的图像压缩应用,大家可以感受一下。

    https://huggingface.co/spaces/beihai/Image-Compression-with-SVD

    功能很简单,上传需要压缩的图片,选择压缩比,提交即可。

    下面咱们就一起看看实现过程

    用SVD压缩图像

    原理很简单:
    将图片分解为RGB三颜色矩阵,将每个颜色矩阵进行奇异值分解,然后选择指定数量的特征对矩阵进行压缩。

    核心代码

    完整代码大家可以clone我的huggingface

    https://huggingface.co/spaces/beihai/Image-Compression-with-SVD

    核心代码1:

    p表示奇异值的百分比,根据指定的清晰度提取奇异值清晰度越高,压缩比越低,提取的奇异值的个数也就越多,图片也就越不会失真)

    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函数和gradio前端的实现

    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 上线机器学习应用(纯免费)我已经介绍过很多遍了,这里就不赘述了,还不太熟悉的同学请移步我这篇文章:腾讯的这个算法,我搬到了网上,随便玩!

    这里就提一下遇到的小问题及解决方法吧。

    由于用了cv2,所以要安装opencv-python,但是运行中报错如下:

      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
    

    针对这个错误,网上有以下方法:

    1 yum安装:

    yum install libglvnd-glx
    

    2 重新安装opencv包:

    pip uninstall opencv-python
    pip install opencv-python-headless
    

    第一种方法需要root权限,建议直接第二种方法吧,省事。

  • 相关阅读:
    聊聊Mybatis的实现原理
    Android开发----实现登录注册页面(创建本地数据库,对注册的账户密码进行存储)
    【python】我用python写了一个可以批量查询文章质量分的小项目(纯python、flask+html、打包成exe文件)
    opencv-python之图像的加法与按位运算
    山西电力市场日前价格预测【2023-10-01】
    SpringBoot特点
    lightdb支持cast(expr as unsigned)-mysql兼容
    【深入浅出系列】之代码可读性
    基于ATX的自动化测试管理软件:Q-Automation
    MySQL SQL语句限制参数
  • 原文地址:https://www.cnblogs.com/jpld/p/16155818.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号