文章目录

  • 一、简单的图像压缩
  • 二、基于机器学习的图像压缩方法
    • SVD图像压缩
    • PCA图像压缩
  • 三、基于K-means图像压缩
一、简单的图像压缩
import cv2'''====图像压缩=====CV_INTER_NN - 最近邻插值,CV_INTER_LINEAR - 双线性插值 (缺省使用)CV_INTER_AREA - 使用像素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法..CV_INTER_CUBIC - 立方插值.
'''image=cv2.imread(r"C:\Users\xxx\Desktop\piaoju\0190819210415.png")
res = cv2.resize(image, (image.shape[1],image.shape[0]), interpolation=cv2.INTER_AREA)
cv2.imwrite(r"C:\Users\xxx\Desktop\piaoju\0190819210415_2.png",res)# 使用一张1.2M的图片直接压缩至868KB。(保持原图片分辨率大小)

ImageEnhance模块:https://blog.csdn.net/icamera0/article/details/50753705

  • ImageEnhance.Color(image) 颜色增强类:用于调整图像的颜色均衡
  • ImageEnhance.Brightness(image) 亮度增强类:用于调整图像的亮度。
  • ImageEnhance.Contrast(image) 对比度增强类:用于调整图像的对比度。

一张1.2M的图片依次先执行压缩(868KB),再提升对比度,再转成灰度图

from PIL import Image
from PIL import ImageEnhance
from PIL import ImageFilter
import cv2image=cv2.imread(r"C:\Users\xxx\Desktop\piaoju\0190819210415.png")
res = cv2.resize(image, (image.shape[1],image.shape[0]), interpolation=cv2.INTER_AREA)
imgE = Image.fromarray(cv2.cvtColor(res,cv2.COLOR_BGR2RGB))
imgEH = ImageEnhance.Contrast(imgE)
# 当参数为1.2 灰度图243KB,当参数为2.8 灰度图124KB.(亮度提升后转灰度图,图片会黑白分化)
gray=imgEH.enhance(1.2).convert("L")
gray.save(r"C:\Users\xxx\Desktop\piaoju\0190819210415_4.png")#图像增强
# 创建滤波器,使用不同的卷积核
gary2=gray.filter(ImageFilter.DETAIL)
gary2.save(r"C:\Users\xxx\Desktop\piaoju\0190819210415_5.png")#图像点运算
gary3=gary2.point(lambda i:i*0.9)
gary3.save(r"C:\Users\xxx\Desktop\piaoju\0190819210415_6.png")

依次是原图,enhance(1.2),enhance(2.8)的图片

二、基于机器学习的图像压缩方法

关于PCA降维,SVD理论详情:https://blog.csdn.net/wsp_1138886114/article/details/80967843

SVD图像压缩
import cv2
import numpy as npdef rebuild_img(u, sigma, v, p):  # p表示奇异值的百分比print('sigma.shape', sigma.shape)print('sum(sigma)', sum(sigma))m , n= len(u),len(v)a = np.zeros((m, n))         # 创建空图片count = (int)(sum(sigma))curSum = 0k = 0while curSum <= count * p:uk = u[:, k].reshape(m, 1)vk = v[k].reshape(1, n)a += sigma[k] * np.dot(uk, vk)curSum += sigma[k]k += 1print('==k===:', k)a[a < 0] = 0a[a > 255] = 255return np.rint(a).astype("uint8")if __name__ == '__main__':img = cv2.imread(r'C:\Users\xxx\Desktop\piaoju\caiyao001.jpg')for p in np.arange(0.1, 1, 0.2):u, sigma, v = np.linalg.svd(img[:, :, 0])R = rebuild_img(u, sigma, v, p)u, sigma, v = np.linalg.svd(img[:, :, 1])G = rebuild_img(u, sigma, v, p)u, sigma, v = np.linalg.svd(img[:, :, 2])B = rebuild_img(u, sigma, v, p)I = np.stack((R, G, B), 2)cv2.imshow("svd_" + str(p * 100),I)cv2.imwrite("C:\\Users\\xxx\\Desktop\\piaoju\\svd_" + str(p * 100) + ".jpg", I)cv2.imshow("img" , img)cv2.waitKey(0)cv2.destroyAllWindows()


图片大小依次为:19.2KB,20.2KB,28.3KB,40.12KB,49.5KB,50.4KB(原图)

小结
奇异值分解能够有效的降低数据的维数,以本文的图片为例,从450维降到149维后,还保留了90%的信息
虽然奇异值分解很有效,但是不能滥用,一般情况下要求降维后信息的损失度不能超过5%,甚至是1%
Ng的视频中提到常见的错误使用降维的情况,在这里也贴出来:
使用降维解决过拟合问题
不论什么情况,先用降维处理一下数据,即把降维当做模型训练的必须步骤
PCA图像压缩

pca函数实现图像的降维
关于PCA理论详情请点击:https://blog.csdn.net/wsp_1138886114/article/details/80967843

import numpy as np
import cv2def comp_2d(image_2d,rate):height,width = image_2d.shape[:2]# 执行下面这一行报错显示无法广播。我修改了dtype还是报错,不知道为何。# cov_mat = image_2d - np.mean(image_2d, axis=1) 。# print("data.type:", image_2d.astype(np.float64).dtype)# print("mean.type:", np.mean(image_2d, axis=1).dtype)## print("data.shape:", image_2d.astype(np.float64).shape)# print("mean.shape:", np.mean(image_2d, axis=1).shape)# 我自己广播代码为如下三行代码mean_array = np.mean(image_2d, axis=1)mean_array = mean_array[:, np.newaxis]mean_array = np.tile(mean_array, width)cov_mat = image_2d.astype(np.float64) - mean_arrayeig_val, eig_vec = np.linalg.eigh(np.cov(cov_mat))  # 求特征值 特征向量p = np.size(eig_vec, axis=1)idx = np.argsort(eig_val)idx = idx[::-1]eig_vec = eig_vec[:, idx]numpc = rateif numpc < p or numpc > 0:eig_vec = eig_vec[:, range(numpc)]score = np.dot(eig_vec.T, cov_mat)recon = np.dot(eig_vec, score) + mean_arrayrecon_img_mat = np.uint8(np.absolute(recon))return recon_img_matif __name__ == '__main__':data = cv2.imread(r'C:\Users\xxx\Desktop\piaoju\caiyao001.jpg')height, width = data.shape[:2]a_g = data[:, :, 0]a_b = data[:, :, 1]a_r = data[:, :, 2]rates = [30,60,90]  #主成分前30,60,90个k值for rate in rates:g_recon, b_recon, r_recon = comp_2d(a_g,rate), comp_2d(a_b,rate), comp_2d(a_r,rate)result = cv2.merge([g_recon, b_recon, r_recon])cv2.imshow('result_'+str(rate),result)cv2.waitKey(0)cv2.destroyAllWindows()


显然,k=30时就包含了矩阵的至少70%的信息含量,当k=90时就包含了矩阵的至少90%信息含量。
代码参考:https://github.com/NourozR/Reconstruction-and-Compression-of-Color-Images/blob/master。

三、基于K-means图像压缩

代码查看请点击:https://blog.csdn.net/wsp_1138886114/article/details/80893941

参考:
https://blog.csdn.net/HHTNAN/article/details/79711046
https://blog.csdn.net/wsp_1138886114/article/details/80893941
https://blog.csdn.net/wsp_1138886114/article/details/80967843
https://github.com/NourozR/Reconstruction-and-Compression-of-Color-Images/blob/master。

OpenCV—python 图像压缩相关推荐

  1. Opencv - python快速入门

    Opencv - python 文章目录 Opencv - python 1. 图像的IO操作 1.1 读取图像 1.2显示图像 1.3 保存图像 1.4 总结 2 绘制几何图形 2.1 绘制直线 2 ...

  2. OpenCV+python:Canny边缘检测算法

    1,边缘处理 图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用. 在空域运算中来说,对图像的锐化就是计算微分.由于数字 ...

  3. OpenCV Python在计算机视觉中的应用

    OpenCV Python教程 在这篇文章中,我们将使用Python中的OpenCv来涵盖计算机视觉的各个方面.OpenCV长期以来一直是软件开发的重要组成部分. 什么是计算机视觉? 我们考虑一个场景 ...

  4. OpenCV Python教程(2、图像元素的访问、通道分离与合并)

    OpenCV Python教程之图像元素的访问.通道分离与合并 转载请详细注明原作者及出处,谢谢! 访问像素 像素的访问和访问numpy中ndarray的方法完全一样,灰度图为: [python] v ...

  5. python中import cv2遇到的错误及安装方法_独家利用OpenCV,Python和Ubidots来构建行人计数器程序(附代码amp;解析)...

    作者:Jose Garcia 翻译:吴振东 校对:张一豪 本文约4000字,建议阅读14分钟. 本文将利用OpenCV,Python和Ubidots来编写一个行人计数器程序,并对代码进行了较为详细的讲 ...

  6. 如何把OpenCV Python获取的图像传递到C层处理

    原文:https://blog.csdn.net/yushulx/article/details/52788051 用OpenCV Python来开发,如果想要用到一些C/C++的图像处理库,就需要创 ...

  7. openCV—Python(6)—— 图像算数与逻辑运算

    openCV-Python(6)-- 图像算数与逻辑运算 一.函数简介 1.add-图像矩阵相加 函数原型:add(src1, src2, dst=None, mask=None, dtype=Non ...

  8. opencv python 图像去噪

    opencv python 图像去噪 文章目录: https://blog.csdn.net/Annihilation7/article/details/82718470 https://segmen ...

  9. opencv python 中cv2.putText()函数的用法

    opencv python 中cv2.putText()函数的用法 文章目录: 一.快速使用 二.官方文档 三.使用举例 虽然用啦很多次,还是决定记录一下 一.快速使用 cv2.putText(ima ...

最新文章

  1. iOS下载历史版本APP
  2. 移动端调用百度地图api_百度智能云图像识别API调用
  3. 如何在Windows 8中更改登录屏幕的颜色
  4. C++ 在派生类中使用using声明改变基类成员的可访问性
  5. 2020国货彩妆市场研究报告
  6. Emacs sql-mode 自动连接数据库 (当前仅支持MySQL)
  7. 关于使用Aptana+Pydev构建Python开发环境(Django)
  8. matlab中批量tiff转png,图片(jpg,png,tif等)批量转dicom(dcm)格式
  9. java开发 网关_SpringCloud系列之网关(Gateway)应用篇
  10. java string查找_Java lastIndexOf() 方法
  11. java外文文库_java外文文献毕业设计
  12. linux游戏主机,Steam OS界面介绍
  13. gmail注册方法_如何在Gmail中释放空间:5种回收空间的方法
  14. 电脑故障(一)台式电脑看网络直播屏幕黑屏
  15. 毫米波雷达基本原理,多普勒效应技术,你知道多少?
  16. 模型加速之轻量化网络
  17. Error C2065 'cout': undeclared identifier
  18. 努力成为一名数据分析师
  19. Intel SIMD: AVX2
  20. 苹果笔记本没有计算机管理员,苹果电脑忘记管理员密码怎么办_mac电脑忘记管理员密码的处理办法...

热门文章

  1. 这是什么啊(初学MySQL时一些疑问解答,不断更新....)
  2. Android设备标准HID协议(外接输入设备)接入蓝牙扫描枪的各种坑与解决办法
  3. WineHQ中文乱码问题
  4. 使用Zend Debugger + Zend Studio 调试web
  5. java+字体包下载_onlyoffice5.4.2离线包下载—解决中文字体问题
  6. java模拟时钟源代码_Android实现模拟时钟(简单+漂亮)--时针、分针、秒针
  7. 商机 | 大数据/政务云采购清单 招标5起,最高招标价为713万(10.18-10.20)
  8. “捕鱼达人”开创手机游戏时代
  9. 国内LORA首颗SOC芯片ASR6601ARM Cortex M4
  10. CAD绘图中的图层设置