前言
最近在做图像的数据集时,经常要对批量文件进行处理。因为代码不熟练,每次都要查,就很烦,这次直接把数据集做好了,但以后也可能重做啊,谁知道这鬼数据会不会影响结果。苦逼!这会趁着跑实验的时间,记录一下常用操作,方便翻阅。
查看图片通道数
注意不是所有图片都是3通道的,png图像有3有4,4通道的图多了一个透明度。
遍历文件夹
path = '你的文件路径'
all_image = os.listdir(path)# 返回当前路径下的文件及文件夹列表
# print(all_image)
for i in all_image:
img_path = os.path.join(path,i)# 遍历到了所有文件
文件路径分割
import os
file_path = "D:/test/test.py"
(filepath,tempfilename) = os.path.split(file_path)
(filename,extension) = os.path.splitext(tempfilename)
filepath为文件的目录,即D:/test
filename为文件的名字,即test
extension为文件的扩展名,即.py
参考:python分割文件目录/文件名和后缀
文件重命名
os.rename(img_path,dst_path)
图片格式转换
在imread进来图片后可以直接通过cv2.imwrite保存png格式图片,完成转换。
cv2.imwrite('./_png/'+n+'.png',img)
综合
import cv2
import os
path = '读取路径'
save_path = '保存路径'
all_image = os.listdir(path)# 返回当前路径下的文件及文件夹列表
print(all_image)
for i in all_image:
img_path = os.path.join(path,i)
img = cv2.imread(img_path)
# 图像使用双三次插值缩小3倍
a = int(img.shape[0]/3)
b = int(img.shape[1]/3)
#print (a,b)
(filename,extension) = os.path.splitext(i)
img2 = cv2.resize(img,(b,a),interpolation=cv2.INTER_CUBIC)
# print (save_path+'/'+filename)
cv2.imwrite(save_path+'/'+filename+'x3'+extension,img2)
print('finished convert')
PSNR和SSIM计算公式
自己写的公式,如果sr图像和原图不一样大时(跑EDSR时出现了这个问题),有双三次插值对sr进行矫正。可能和正统的PSNR计算有出入,有待考证,同学们多提意见。。。这里主要是为了将sr后的图和bicubic后的图的指标进行对比。
'''
https://blog.csdn.net/lly1122334/article/details/102471732?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_utm_term-0&spm=1001.2101.3001.4242
'''
import cv2
import math
import numpy as np
from skimage import measure
def psnr(img1, img2):
"""计算PSNR"""
mse = np.mean((img1 / 255 - img2 / 255) ** 2) # 均方差
if mse < 1.0e-10: # 几乎无差异返回100
return 100
PIXEL_MAX = 1 # 像素最大值
return 20 * math.log10(PIXEL_MAX / math.sqrt(mse))
if __name__ == "__main__":
img1 = cv2.imread('hr路径')#hr
img2 = cv2.imread('sr路径')#sr
img3 = cv2.imread('lr路径')#lr
#print ('The shape of HR is:',img1.shape[0:2])
'''获取相同的形状'''
if img1.shape != img2.shape:
print ('The shape of HR is',img1.shape)
print ('The shape of SR is',img2.shape)
img2 = cv2.resize(img2,(img1.shape[1],img1.shape[0]),interpolation=cv2.INTER_CUBIC)
img3 = cv2.resize(img3,(img1.shape[1],img1.shape[0]),interpolation=cv2.INTER_CUBIC)
'''输出PSNR & SSIM'''
print('PSNR of SR:',psnr(img1, img2))
print('PSNR of bicubic:',psnr(img1, img3))
print('SSIM of SR:',measure.compare_ssim(img1, img2, data_range=255, multichannel=True))
print('SSIM of SR:',measure.compare_ssim(img1, img3, data_range=255, multichannel=True))
最好是能找个计算文件夹中所有内容的指标的平均值。