精华内容
下载资源
问答
  • opencv压缩图片

    千次阅读 2018-10-07 14:49:53
    由于前段时间用手机拍照,发现图片太大,一张就差不多5M,传到电脑后太大了,不方便处理,所以写了这个用opencv压缩一下。 下面是具体代码,代码较简单,大家一看就懂。   #coding = utf-8 import cv2 import...

    由于前段时间用手机拍照,发现图片太大,一张就差不多5M,传到电脑后太大了,不方便处理,所以写了这个用opencv来压缩一下。

    下面是具体代码,代码较简单,大家一看就懂。

     

    #coding = utf-8
    import cv2
    import os
    import math
    
    def get_doc_size(path):
        try:
            size = os.path.getsize(path)
            return get_mb_size(size)
        except Exception as err:
            print(err)
    
    def get_mb_size(bytes):
        bytes = float(bytes)
        mb = bytes / 1024 / 1024
        return mb
    
    
    def delete_file(path):
        if file_exist(path):
            os.remove(path)
        else:
            print('no such file:%s' % path)
    
    
    def file_exist(path):
        return os.path.exists(path)
    
    
    def resize_rate(path, resize_path, fx, fy):
        image = read_image(path)
        im_resize = cv2.resize(image, None, fx=fx, fy=fy)
        delete_file(resize_path)
        save_image(resize_path, im_resize)
    
    
    def save_image(path, image):
        cv2.imwrite(path, image)
    
    
    def read_image(path):
        return cv2.imread(path)
    
    
    path = "D://3//313.jpg" #被压缩图片的绝对路径
    resize_path = "D://3//3.jpg"  #压缩图片的存储位置,记住给压缩图片命名,3.jpg就是压缩后图片的名字
    size = get_doc_size(path)
    print(size) #原始的size
    delete_file(resize_path)
    filesize = 0.8   #压缩比例
    
    while size > filesize:
        rate = math.ceil((size / filesize) * 10) / 10 + 0.1
        rate = math.sqrt(rate)
    
        rate = 1.0 / rate
        if file_exist(resize_path):
            resize_rate(resize_path, resize_path, rate, rate)
        else:
            resize_rate(path, resize_path, rate, rate)
        size = get_doc_size(resize_path)
    

     

    下面是效果截图

     

     

    下面是我的github链接,里面有源码,读者可以自行下载

    https://github.com/jiang-congcong/compress-picture-by-opencv3

    展开全文
  • opencv压缩图片,设置压缩率,因无法设置0资源下载,故提供百度云链接: https://pan.baidu.com/s/1Qw30XwwCXNq1SBqXWmsIvg 密码: u3jq
  • 最近有人问能不能做一个批量能压缩图片大小的工具,于是搜索一番,发现使用python的相关的函数很容易就能简单实现。首先导入需要的包;以及支持的格式,这次使用tkinter来试试。 # -*- coding: utf-8 -*- # @Date :...

    最近有人问能不能做一个批量能压缩图片大小的工具,于是搜索一番,发现使用python的相关的函数很容易就能简单实现。首先导入需要的包;以及支持的格式,这次使用tkinter来试试。

    在这里插入图片描述

    # -*- coding: utf-8 -*-
    # @Date    : 2020-12-07 15:13:48
    # @Author  : autohe (${email})
    # @知乎    : https://www.zhihu.com/people/kuanye
    # @微信    : xdxh-1
    # @funtion : 
    # @Version : $Id$
    
    import os
    from tkinter import *
    from tkinter import filedialog
    from tkinter import messagebox
    import cv2
    import numpy as np
    PIC_LIST = ['.JPEG','.PSD','.PNG','.TIFF','.JPG']
    
    

    接下来实现框体类。tkinter非常方便就能实现。

    
    class ThinkerGui(object):
        def __init__(self):
            window = Tk()    
            window.title("图片压缩程序")
            # 设定窗口的大小(长 * 宽)
            window.geometry('860x640+20+20')   
    
            self.before_folder = StringVar()
            self.after_folder = StringVar()
            self.compression_ratio = StringVar(value="50")
    
            Label(window,text="原图文件夹:").grid(row=0, column=0)
            self.set_before_path = Entry(window, textvariable=self.before_folder, width=80)
            self.set_before_path.grid(row=0, column=1)
            Button(window, text="选择文件夹", command=self.set_bfolder_path).grid(row=0, column=2)
    
            Label(window,text="原图文件夹:").grid(row=1, column=0)
            self.set_after_path = Entry(window, textvariable=self.after_folder, width=80)
            self.set_after_path.grid(row=1, column=1)
            Button(window, text="选择文件夹", command=self.set_afolder_path).grid(row=1, column=2)
        
            Label(window,text = "压缩率:1-100,数字越小压缩越大").grid(row = 2, column = 0)
            Entry(window, textvariable = self.compression_ratio, width=50).grid(row = 2,
             column = 1)
            Button(window, text = "开始压缩", command = self.compression_rate).grid(row = 2, 
            column = 2)
    
            self.log_data = Text(window, width=50, height=20)  # 日志框
            self.log_data.grid(row=13, column=0, columnspan=10)
    
            window.mainloop()
            
            
        def set_bfolder_path(self):
            path_ = filedialog.askdirectory() 
            print("set_bfolder_path", path_)      
            if path_ != '':  
                self.before_folder = path_
                if self.after_folder == self.before_folder:   
                    messagebox.showinfo('提示','不能和原文件目录一样,重选')   
                else:       
                    self.set_before_path.delete(0, END)
                    self.set_before_path.insert(END, self.before_folder)
    
        def set_afolder_path(self):
            path_ = filedialog.askdirectory()
            print("set_afolder_path", path_)     
            if path_ != '':  
                self.after_folder =  path_
                if self.after_folder == self.before_folder:
                    messagebox.showinfo('提示','不能和原文件目录一样,重选')
                else:
                    self.set_after_path.delete(0, END)
                    self.set_after_path.insert(END, self.after_folder)    
                    
        #将算法绑定            
        def compression_rate(self):
     
            for file in os.listdir(self.before_folder):
                if os.path.splitext(file)[1].upper() in PIC_LIST:
     
                    #img=cv2.imread(self.before_folder+'/'+ file, cv2.IMREAD_COLOR)
                    img = cv2.imdecode(np.fromfile(self.before_folder+'/'+ file, dtype=np.uint8), -1)
                    if img.size != 0:
                        #cv2.imwrite(self.after_folder+'/'+ file, img, [cv2.IMWRITE_JPEG_QUALITY,50])
                        cv2.imencode('.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), 
                        		int(self.compression_ratio.get())])[1].tofile(self.after_folder+'/after_'+ file)                          
                        insert_str = "{},转换完成:压缩图片大小:{}\n".format(file, 
                        os.path.getsize(self.after_folder+'/after_'+ file))   
                        self.log_data.insert(END, insert_str)                    
    

    opencv居然不能支持中文路径,所以还需要转换了一下;

    img = cv2.imdecode(np.fromfile(self.before_folder+'/'+ file, dtype=np.uint8), -1)
    
    cv2.imencode('.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), 
    			int(self.compression_ratio.get())])[1].tofile(self.after_folder+'/after_'+ file)
    

    真正实现作用的就上面两句,读取的img对象,是一个numpy的class格式。具体的算法没有进行研究。效果呢,由于失误,我把自己保存多年的照片意外全部压缩了,无法复原。

    展开全文
  • python-opencv压缩视频

    2018-07-07 20:54:58
    利用python-opencv读取本地视频,并且压缩至指定大小,保存
  • python多种方法压缩图片opencv、PIL、tinypng压缩图片文章目录:1 python+opncv实现图片的压缩2 python+PIL实现图片的压缩3 python+tinypng实现图片的压缩3.1 tinypng介绍3.2 tinypng压缩图片API使用3.2.1 ...

    1 python+opncv实现图片的压缩

    class Compress_img:
    
        def __init__(self, img_path):
            self.img_path = img_path
            self.img_name = img_path.split('/')[-1]
    
        def compress_img_CV(self, compress_rate=0.5, show=False):
            img = cv2.imread(self.img_path)
            heigh, width = img.shape[:2]
            # 双三次插值
            img_resize = cv2.resize(img, (int(heigh*compress_rate), int(width*compress_rate)),
                                    interpolation=cv2.INTER_AREA)
            cv2.imwrite('result_cv_' + self.img_name, img_resize)
            print("%s 已压缩," % (self.img_name), "压缩率:", compress_rate)
            if show:
                cv2.imshow(self.img_name, img_resize)
                cv2.waitKey(0)
    
    if __name__ == '__main__':
        img_path = './ym.jpg'
        compress = Compress_img(img_path)
    
        # 使用opencv压缩图片
        compress.compress_img_CV()
    

    2 python+PIL实现图片的压缩

    class Compress_img:
    
        def __init__(self, img_path):
            self.img_path = img_path
            self.img_name = img_path.split('/')[-1]
    
        def compress_img_PIL(self, way=1, compress_rate=0.5, show=False):
            '''
            img.resize() 方法可以缩小可以放大
            img.thumbnail() 方法只能缩小
            :param way:
            :param compress_rate:
            :param show:
            :return:
            '''
            img = Image.open(self.img_path)
            w, h = img.size
            # 方法一:使用resize改变图片分辨率,但是图片内容并不丢失,不是裁剪
            if way == 1:
                img_resize = img.resize((int(w*compress_rate), int(h*compress_rate)))
                resize_w, resieze_h = img_resize.size
                img_resize.save('result_' + self.img_name)
                if show:
                    img_resize.show()  # 在照片应用中打开图片
                    # 或
                    # plt.imshow(img_resize)
                    # plt.axis('off')
                    # plt.show()
    
            # 方法二: 和resize方法类似,不过这里我测试好型这个函数已经不能使用,不知是不是版本问题
            # 问题:https://blog.csdn.net/kethur/article/details/79992539  tumbnail没有返回值
            if way == 2:
                # img_resize = img.thumbnail((400, 400))
                img.thumbnail((int(w*compress_rate), int(h*compress_rate)))
                resize_w, resize_h = img.size
                img.save('result2_' + self.img_name)
            print("%s 已压缩," % (self.img_name), "压缩率:", compress_rate)
    
    
    if __name__ == '__main__':
        img_path = './ym.jpg'
        compress = Compress_img(img_path)
    
        # 使用PIL压缩图片
        compress.compress_img_PIL(way=1, show=True)
    

    3 python+tinypng实现图片的压缩

    3.1 tinypng介绍

    打开它的官网https://tinypng.com发现其提供线上上传图片进行压缩,看到例子介绍压缩率还是蛮可观的,而且压缩前后对图片影响不大。我们点进去DEVELOPER API,可以看出tingpng支持很多变成语言API,如下:

    • HTTP
    • RUBY
    • PHP
    • NODE.JS
    • PYTHON
    • JAVA
    • .NET

    tinypng对图片的压缩率可以达到惊人的90%(例如:一张20M的图片可以被压缩到2M),除了对图片压缩,它的 API 还提供图片裁剪、加水印、保存压缩图片至云服务商(亚马逊云、谷歌云)等功能,非常强大

    tinypng并不是完全免费的每个月可以免费调用API使用500次
    在这里插入图片描述

    3.2 tinypng压缩图片API使用

    3.2.1 tingypng安装

    先安装tinypng

    pip install --upgrade tinify

    3.2.2 tingypng安装

    1、申请API使用,生成key

    在官网,填写your full nameyour email,填写好之后你会收到一封邮件

    • full name:shliang
    • email:shliang0603@gmail.com
      在这里插入图片描述
      2、打开邮件跳转获取Key
      在这里插入图片描述

    3、python + tinypng实现图片压缩
    获取到专属的Key之后,你就可以使用相应的API实现图片的压缩了

    import tinify
    
    tinify_keys = ""YOUR_API_KEY""
    source = tinify.from_file("test.jpg")
    source.to_file("compress_img.jpg")
    

    实测:

    • 压缩前图片大小:3.53M
    • 压缩后图片大小:627kb
    • 压缩比率: c o m p r e s s _ r a t e = 3.53 × 1024 k b − 627 k b 3.53 × 1024 k b × 100 % ≈ 82.7 % compress\_rate = \frac{3.53 \times1024kb-627kb}{3.53 \times1024 kb}\times100\% \approx82.7\% compress_rate=3.53×1024kb3.53×1024kb627kb×100%82.7%
    • 压缩3.53M图片用时:29s

    图片压缩的时间比较长,但是图片压缩的效果非常好,首先压缩后图片的分辨率保持不变,其次压缩后图片的清晰度和原图几乎一样,真的很牛!(我严重怀疑这是通过一种深度学习方法实现的[捂脸])

    3.2.3 tingypng优缺点:

    优点:

    • 图片压缩比率高
    • 几乎可以实现无损压缩
    • 压缩不改变图片分辨率

    缺点:

    • 压缩时间比较长
    • 收费:显然这对于一个工程应用是不能使用的

    4 python+pngquant实现图片的压缩

    pngquant是国外一个有损的PNG压缩库,介绍称结合vector quantization算法生成高质量的色彩范围,用脚本同样可以处理批量图片压缩。其支持命令行和源码库形式使用,这里介绍的是使用命令行方式:

    • pngquant只能对png图片进行压缩
    • 官方称:图片的压缩率可以达到70%

    官网:https://pngquant.org/

    使用:

    import subprocess
    #需修改为你自己本地pnguant.exe路径
    PNGQUANT_PATH = r'Your path\pngquant.exe'
    ...
    cmd_command = '"{0}" 256 -s1 --force --quality=50-50 "{1}" -o "{2}"'.format(PNGQUANT_PATH, "unoptimized.png", "optimized.png")
    #执行命令
    p = subprocess.Popen(cmd_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    retval = p.wait()
    

    实测:

    • 压缩前图片大小:2.81M
    • 压缩后图片大小:733kb
    • 压缩比率: c o m p r e s s _ r a t e = 2.81 × 1024 k b − 733 k b 2.81 × 1024 k b × 100 % ≈ 74.5 % compress\_rate = \frac{2.81 \times1024kb-733kb}{2.81 \times1024 kb}\times100\% \approx74.5\% compress_rate=2.81×1024kb2.81×1024kb733kb×100%74.5%

    ##4.2 jpg图片转换成png图片

    由于jpg图片时没有alpha通道的,而pngquant只能对png图片进行压缩。因此,因此我的想法是这样的:

    • 1、把jpg图片转化成png图片

    • 2、使用pngquant对压缩的图片进行压缩

    • 3、把压缩后的png图片再转换成jpg图片

    • JPEG - JPEG图像旨在通过删除人眼不会注意到的信息,使详细的摄影图像尽可能小。因此,与PNG相比,图像的尺寸相当小。但是在JPG图像中,您无法存储图像的Alpha透明度信息。因此,如果不需要透明度信息,JPG是最具可扩展性的解决方案。

    • PNG - PNG是一种很好的格式,它将无损编码与直接颜色(数千种颜色,就像JPEG)相结合。它支持alpha透明度。保存为PNG的照片可能比同等JPEG图像大至少5倍,可见质量几乎没有改善。因此,如果文件大小不是问题,并且您希望获得最佳质量,那么PNG就是好的。

    ###4.2.1 jpg图片转换成png图片

    1

    2、方法二:使用`PythonMagick库实现jpg转换png

    PythonMagick库无法用pip或者easy_install来安装,因此,需要手动安装,地址如下(非官方的python库包):

    https://www.lfd.uci.edu/~gohlke/pythonlibs/#pythonmagick

    选择合适版本下载后,进入文件所在位置,直接pip install + 文件名即可完成安装。

    import PythonMagick
    
    # 1 使用PythonMagick图片格式转换 jpg2png   jpg:3.71M-> png:13.74M
    im = PythonMagick.Image('./test.jpg')
    # im.sample('128x128')
    im.write('output.png')
    
    # 2 使用pngquant对图片压缩: png:13.74M->png:3.81M
    
    # 3 使用PythonMagick图片格式转换 png2jpg   png:3.81M->jpg:4.81M  (笑cry)
    im = PythonMagick.Image('./output.png')
    # im.sample('128x128')
    im.write('output.jpg')
    
    
    

    实测:

    • 一样3.71M的jpg图片
    • 转换成png图片大小为:13.74M

    然后再使用pngquant压缩,压缩后的图片大小为:3.63M,压缩后的图片有一定的信息损失

    ###4.2.2 png图片转换成jpg图片

    在从PNG转换为JPG时,我们以jpeg格式创建新图像文件,读取png图像,然后将读取的图像粘贴到新创建的空白jpg图像。然后保存jpg图像文件。这是从PNG转换为JPG背后的基本思想。

    from PIL import Image
    
    # png: 3.81M -> jpg:1.49M
    im = Image.open("output.png")
    rgb_im = im.convert('RGB')
    rgb_im.save('result_PIL_jpg2png.jpg')
    

    from PIL import Image
    im = Image.open("output.png")
    bg = Image.new("RGB", im.size, (255,255,255))
    bg.paste(im,im)
    bg.save('result_PIL_jpg2png2.jpg')
    

    参考:https://blog.csdn.net/weixin_39153202/article/details/96566897 # 图片格式转换

    展开全文
  •  #include "cv.h" #include "highgui.h" #include "stdio.h" int main(int argc,char *argv[]) { IplImage *image=0,*imageresize=0; image=cvLoadImage("lena... imageresize=cvCreateImage(cvSize(1

     

     
    自己把图像文件 lena.jpg 添加到建的项目文件运行就可以了! 

     

    展开全文
  • 由于项目需要把图片resize成另外一个大小,可通过以下代码实现: cv::Mat srcImage = cv::imread(*it, cv::IMREAD_ANYDEPTH); cv::Mat trgtImage = cv::Mat::zeros(1632, 1224, CV_16UC1); ...
  • 我使用 opencv 进行图片处理,于是想着直接使用 opencv 进行图片压缩处理, opencv 本身包含了压缩到指定像素大小的方法,奈何寻找了很多方法均不能压缩到指定文件尺寸,于是自己在思考后写出了此方法。本文使用...
  • 主要介绍了python opencv 批量改变图片的尺寸大小的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 闲话少说,先看程序: ...#include "opencv2\opencv.hpp" using namespace cv; using namespace std; int main(void){ const string imageName("2.jpg"); Mat image = imread(imageName); //读取图像 imsh
  • opencv分类器遇到的问题,老是记不住… public static void main(String[] args) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); String file = "D:\\temp\\image_sign_wood"; img_be_gey(file); } ...
  • opencv图片简单压缩

    千次阅读 2017-09-04 11:35:33
    #include <opencv2/opencv.hpp> #include #include <math.h> #include <iostream> using namespace std; using namespace cv; double T = 40; void resize(Mat&); void pyrDown_up(Mat&); int main() { Mat src...
  • 利用OpenCV保存图片,提高压缩质量

    千次阅读 2019-09-30 19:17:52
    OpenCV中的函数cvSaveImage(filename,img)来保存图像,很少注意到它还有第三个参数。第三个参数就是用来调整JPG图像压缩质量的,它是一个含有3个元素的数组,具体使用方法如下: #define CV_IMWRITE_JPEG_...
  • imwrite() opencv压缩问题

    千次阅读 2019-11-22 20:26:33
    第一,opencv的存储图片函数imwrite是可以通过第三个函数参数来调整保存图片压缩比的,比如保存图片为jpg格式,我们如果我们写成 第二,jpg格式的图片读进内存,如果再保存为jpg格式后,容量会被压缩的,这是...
  • I am using python 3 and latest version of openCV. I am trying to resize an image using the resize function provided but after resizing the image is very distorted. Code :import cv2file = "/home/tanmay...
  • OpenCV生成的图像相对较大,可能类似对应Photoshop最佳的那种保存的,但是我想要相对小一些的图像,请问如何才能用OpenCV设置JPG图像的压缩质量? 通常用opencv中的函数cvSaveImage(filename,img)来保存图像,很...
  • 基于opencv300的修改图片尺寸(容量)大小和dpi,win7 64位系统,visual studio 2013编译,可点击debug中的t.exe运行即可
  • 添加NuGet包 ...写一个函数用来改变图片大小并且重新命名 read_path是存储图片的文件夹的路径,write_path是改变后图片存储的文件夹路径,filename是图片重命名,width和height分别为图片修改后的宽和高...
  • 6.opencv调整图像大小的新方法imutils.resize一、openCV 调整图像大小 ( cv2.resize )二、项目结构和代码讲解1.项目结构2.代码讲解3.比较 OpenCV 插值方法4....忽略纵横比可能会导致调整大小的图像看起来压缩和扭曲
  • 这是一个关于OpenCV的入门练习,压缩文件包中OpenCV包括:编程说明,完整的VS工程,全部的源代码,编译结果和测试用图等。
  • https://www.cnblogs.com/shoufengwei/p/8526105.html
  • 基于opencv的jpeg压缩

    热门讨论 2013-01-22 15:38:57
    在vs2005+opencv2.0平台下,借助opencv的cvLoadImage函数读入图片,得到图像的rgb数据,然后进行压缩并保存成jpeg格式,
  • opencv中改变像素大小

    2021-03-11 16:01:40
    opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main() { //照片result1.jpg改变像素(尺寸大小) Mat src = imread("result1.jpg"); Size srcSize = Size...
  • opencv标定图片生成程序

    千次阅读 2013-12-07 12:28:22
    我之前也是看了一点opencv,自己写了一个生成黑白棋盘图片的小程序。 是在vc6.0+openCV1.0环境下生成的。 下面是源代码: /******************************************************************************* *此...
  • 要注意: 1. 图片传视频要自己设置帧率...3.写完.avi视频后视频比较大,用ffmpeg将avi视频压缩为mp4 import cv2 from cv2 import VideoWriter, VideoWriter_fourcc, imread, resize import os from subprocess i...
  • 图片压缩(OpenCV)C++版

    2021-07-03 13:15:13
    图片压缩OpenCV配置OpenCV环境测试代码 配置OpenCV环境 参见该链接:配置OpenCV环境 注意事项: (1)解决方案平台那一栏要换成X64. (2)选V15而不是V14. (3)将opencv\build\x64\vc15\bin中的opencv_world450d....
  • 今天小编就为大家分享一篇Python+OpenCV 实现图片无损旋转90°且无黑边,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • OpenCV—python 图像压缩

    千次阅读 2019-09-12 08:58:50
    文章目录一、简单的图像压缩二、待续 一、简单的图像压缩 import cv2 ''' ====图像压缩===== CV_INTER_NN - 最近邻插值, CV_INTER_LINEAR - 双线性插值 (缺省使用) CV_INTER_AREA - 使用像素关系重采样。当...
  • Java OpenCV 裁剪图片

    千次阅读 2020-01-10 14:58:22
    代码 public static void main(String[] ...裁剪原图说明:大小为10*10,具体如下图 裁剪结果 cutResult cutResult1 参考链接及拓展应用 https://blog.csdn.net/sac761/article/details/51926853
  • 基于opencv的图像压缩

    2016-03-05 12:12:54
    保证安装好VS2010,opencv,即可运行

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,522
精华内容 2,208
关键字:

opencv压缩图片大小