Python+Opencv对多个图片进行任意倍数下采样并保存到指定路径

使用Python代码+Opencv库对多张图片下采样并保存到指定路径

对单个图片进行下采样很容易,我们可以使用opencv的函数cv2.pyrDown(),那么多个图片该怎么做呢?经过我2个小时的代码编写(小白勿喷),终于总结了一套适用于任何图像,任何倍数,任何数量图像的批量下采样方法。

废话不多说,直接开始:

首先导入必要的库

import cv2
import os.path

然后我们读取文件夹里面的图像数量 并返回filenum,这里的路径到文件夹即可,注意路径中的分隔符不能为 \ ,(可以为 / 或 \ ),否则会报错

def countFile(dir):
    # 输入文件夹
    tmp = 0
    for item in os.listdir(dir):
        if os.path.isfile(os.path.join(dir, item)):
            tmp += 1
        else:
            tmp += countFile(os.path.join(dir, item))
    return tmp
filenum = countFile("D:\\model\\super-resolution\\.div2k\images\\DIV2K_train_LR_bicubic\\X4")    # 返回的是图片的张数
print(filenum)

注意这里的index为0或者1(为0时后面的代码中if index<9,为1时if index <10,因为index决定了图片的初始索引),这个值也可以自己设置。n的值也很重要,决定了几倍下采样,在后面的代码中也有体现。

# filenum
n = 4
index = 1   #保存图片编号
num = 0     #处理图片计数

主程序:因为我的输入图片名为0001x4.png-0900x4.png,输出图片也是0001x4.png-0900x4.png,所以我得分情况讨论输入输出,各位程序员可以按自己得需求修改此代码,n的值可以决定是2倍下采样还是4倍下采样,程序员可以再添加函数修改,以进行多倍下采样。

for i in range(1,filenum+1):
    ########################################################
    # 1.读取原始图片
    if index < 10:
        filename = "D:\\model\\super-resolution\\.div2k\images\\DIV2K_train_LR_bicubic\\X4\\000"+str(i)+".png"
    elif index < 100:
        filename = "D:\\model\\super-resolution\\.div2k\images\\DIV2K_train_LR_bicubic\\X4\\00"+str(i)+".png"
    else:
        filename = "D:\\model\\super-resolution\\.div2k\images\\DIV2K_train_LR_bicubic\\X4\\0"+str(i)+".png"
    print(filename)
    original_image = cv2.imread(filename)
    # 2.下采样
    if n == 2:
        img_1 = cv2.pyrDown(original_image)
    if n == 4:
        img_1 = cv2.pyrDown(original_image)
        img_1 = cv2.pyrDown(img_1)
    #3.将下采样图片保存到指定路径当中
    if index < 10:
        cv2.imwrite("D:\\model\\super-resolution\\.div2k\\1\\000" + str(index) + ".png", img_1)
    elif index < 100:
        cv2.imwrite("D:\\model\\super-resolution\\.div2k\\1\\00" + str(index) + ".png", img_1)
    else:
        cv2.imwrite("D:\\model\\super-resolution\\.div2k\\1\\0" + str(index) + ".png", img_1)
    num = num + 1
    print("正在为第"+ str(num) + "图片采样......")
    index = index + 1  

原图大小:

下采样以后:

程序的全部代码

import cv2
#import def_Gaussian as dg
#import time
import os.path
#import glob
#####################################################################################################################
#读取文件夹里面的图像数量 并返回filenum
def countFile(dir):
    # 输入文件夹
    tmp = 0
    for item in os.listdir(dir):
        if os.path.isfile(os.path.join(dir, item)):
            tmp += 1
        else:
            tmp += countFile(os.path.join(dir, item))
    return tmp
filenum = countFile("D:\\model\\super-resolution\\.div2k\images\\DIV2K_train_LR_bicubic\\X4")    # 返回的是图片的张数
print(filenum)
# filenum
n = 4
index = 1   #保存图片编号
num = 0     #处理图片计数
for i in range(1,filenum+1):
    ########################################################
    # 1.读取原始图片
    if index < 10:
        filename = "D:\\model\\super-resolution\\.div2k\images\\DIV2K_train_LR_bicubic\\X4\\000"+str(i)+".png"
    elif index < 100:
        filename = "D:\\model\\super-resolution\\.div2k\images\\DIV2K_train_LR_bicubic\\X4\\00"+str(i)+".png"
    else:
        filename = "D:\\model\\super-resolution\\.div2k\images\\DIV2K_train_LR_bicubic\\X4\\0"+str(i)+".png"
    print(filename)
    original_image = cv2.imread(filename)
    # 2.下采样
    if n == 2:
        img_1 = cv2.pyrDown(original_image)
    if n == 4:
        img_1 = cv2.pyrDown(original_image)
        img_1 = cv2.pyrDown(img_1)
    #3.将下采样图片保存到指定路径当中
    if index < 10:
        cv2.imwrite("D:\\model\\super-resolution\\.div2k\\1\\000" + str(index) + ".png", img_1)
    elif index < 100:
        cv2.imwrite("D:\\model\\super-resolution\\.div2k\\1\\00" + str(index) + ".png", img_1)
    else:
        cv2.imwrite("D:\\model\\super-resolution\\.div2k\\1\\0" + str(index) + ".png", img_1)
    num = num + 1
    print("正在为第"+ str(num) + "图片采样......")
    index = index + 1  
x1 = np.linspace(1, 4096, 1024)
x_new = np.linspace(1, 4096, 4096)
from scipy import interpolate
tck = interpolate.splrep(x1, data)
y_bspline = interpolate.splev(x_new, tck)
其中y_bspline就是从1024插值得到的4096的数据
但是,scipy中好像并没有进行采样的函数,嗯..难道是因为太过
                                    file_root = './'#当前文件夹下的所有图片
    file_list = os.listdir(file_root)
    save_out = "../****/"#保存图片的文件夹名称
    for img_name in file_list:
        if img_name.endswith('.tif'):
            img_path = file_root + img_name
            I = cv2.imread(img_path...
                                    基于Python+OpenCV对多张图片进行全景图像拼接源码+项目使用说明(课程设计大作业).zip
【图片全景拼接】消除鬼影,消除裂缝
对多张图片进行基于SIFT的特征检测算法,如果符合最小拼接要求大的关键点matchKeypoints数量,使用OpenCV-Python自带的stitching方法进行全景拼接
【使用方法】
python image_stitching.py --images images/scottsdale --output output.png --crop 1
其中images/scottsdale为待拼接图像所在文件夹,output.png为处理拼接保存后的图像;这里使用了相对路径,因为在工程根目录下运行了终端。不确定在根目录最好使用完整的绝对路径。 --crop 1为是否裁剪黑色边框,缺省则不裁剪。
for info in os.listdir(path):
    domain = os.path.abspath(path)
    info1 = os.path.join(domain,info)
    img = cv2.imread(info1)
    cv2.imshow('original',img)
    b=i+1
    img_name = str(a)
    img = cv2.imread("C:/Users/10230/Desktop/resource_photo/"+img_name+".p
                                    文章目录导读环境文件目录结构详细步骤
深度学习作为机器视觉研究的热点,每训练一个模型都要经过数据采集与处理、设计网络模型、训练模型、验证模型、测试模型等阶段。俗话说“万事开头难”,由于深度学习需要大量数据,而且构造不同的数据集相对复杂,这就需要有一定批量处理数据的能力。在这里以批量处理图片数据为例,用矩形框标出文件夹下所有图片中的缺陷。本文章记录批量处理数据的方法,以备后续学习。
python3.7.7+opencv3.4.11+pycharm社区版+windows10  环境很好搭建 到官网下
                                    图像金字塔是指由一组图像且不同分别率的子图集合,它是图像多尺度表达的一种,以多分辨率来解释图像的结构,主要用于图像的分割或压缩。它将图像在每个方向上扩大为原图像的2倍,新增的行和列均用0来填充,并使用与“向下取样”相同的卷积核乘以4,再与放大后的图像进行卷积运算,以获得“新增像素”的新值。显而易见,原始图像Gi具有M×N个像素,进行向下取样之后,所得到的图像Gi+1具有M/2×N/2个像素,只有原图的四分之一。输出结果如图6-17所示,每次向上取样均为上次图像的四倍,但图像的清晰度会降低。
                                    本篇文章主要总结了图像的采样以及量化的原理以及操作,在此基础上添加了图像的马赛克处理以及图像金子塔,其中参考的一些文章的链接也添加了进去,如果需要更深入的了解和学习可以点进去学习