python读取保存多帧图片数量少了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python读取保存多帧图片数量少了相关的知识,希望对你有一定的参考价值。

cv2.imshow("left", img_left)
filename3=str(number)+'n3'+'.jpg' #打印第number张图片+增值方式+保存类型
cv2.imwrite(savedpath + filename3, img_left)

"""
# 数据增强实现
"""
import cv2
import numpy as np
import os

# 图像平移
def img_translation(image):
# 图像平移 下、上、右、左平移
M = np.float32([[1, 0, 0], [0, 1, 100]])
img_down = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

M = np.float32([[1, 0, 0], [0, 1, -100]])
img_up = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

M = np.float32([[1, 0, 100], [0, 1, 0]])
img_right = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

M = np.float32([[1, 0, -100], [0, 1, 0]])
img_left = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

# 保存图片,需要保存上述的哪一图片,就在cv2.imwrite()中,将哪一图片名放入。
# filename='xxx' +'.jpeg'
# cv2.imwrite(savedpath + filename, img_left)

# 显示图形
cv2.imshow("down", img_down)
filename0=str(number)+'n0'+'.jpg'
cv2.imwrite(savedpath + filename0, img_down)
cv2.imshow("up", img_up)
filename1=str(number)+'n1'+'.jpg'
cv2.imwrite(savedpath + filename1, img_up)
cv2.imshow("right", img_right)
filename2=str(number)+'n2'+'.jpg'
cv2.imwrite(savedpath + filename2, img_right)
cv2.imshow("left", img_left)
filename3=str(number)+'n3'+'.jpg'
cv2.imwrite(savedpath + filename3, img_left)

# 图像缩放
def img_scale(image):
result = cv2.resize(image, (224, 224))
cv2.imshow("scale", result)

filename=str(number)+'n5'+'.jpg'
cv2.imwrite(savedpath + filename, result)

# 图像翻转
def img_flip(image):
# 0以X轴为对称轴翻转,>0以Y轴为对称轴翻转, <0X轴Y轴翻转
horizontally = cv2.flip(image, 0) # 水平镜像
vertically = cv2.flip(image, 1) # 垂直镜像
hv = cv2.flip(image, -1) # 水平垂直镜像

# 显示图形
cv2.imshow("Horizontally", horizontally)
filename1=str(number)+'n6'+'.jpg'
cv2.imwrite(savedpath + filename1, horizontally)
cv2.imshow("Vertically", vertically)
filename2=str(number)+'n7'+'.jpg'
cv2.imwrite(savedpath + filename2, vertically)
cv2.imshow("Horizontally & Vertically", hv)
filename3=str(number)+'n8'+'.jpg'
cv2.imwrite(savedpath + filename3, hv)

# 图像旋转
def img_rotation(image):
# 原图的高、宽 以及通道数
rows, cols, channel = image.shape

# 绕图像的中心旋转
# 参数:旋转中心 旋转度数 scale
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 30, 1)
# 参数:原始图像 旋转参数 元素图像宽高
rotated = cv2.warpAffine(image, M, (cols, rows))

# 显示图像
cv2.imshow("rotated", rotated)
filename1=str(number)+'n9'+'.jpg'
cv2.imwrite(savedpath + filename1, rotated)
#选装60度
W = cv2.getRotationMatrix2D((cols / 2, rows / 2), 60, 1)
# 参数:原始图像 旋转参数 元素图像宽高
rotated1 = cv2.warpAffine(image, W, (cols, rows))
cv2.imshow("rotated", rotated)
filename2=str(number)+'n12'+'.jpg'
cv2.imwrite(savedpath + filename2, rotated1)

#选装145度
W = cv2.getRotationMatrix2D((cols / 2, rows / 2), 60, 1)
# 参数:原始图像 旋转参数 元素图像宽高
rotated2 = cv2.warpAffine(image, W, (cols, rows))
cv2.imshow("rotated", rotated)
filename3=str(number)+'n13'+'.jpg'
cv2.imwrite(savedpath + filename3, rotated2)

# 图像加噪
def img_noise(image, mean=0, var=0.001):
'''
添加高斯噪声
mean : 均值
var : 方差
'''
image = np.array(image / 255, dtype=float)
noise = np.random.normal(mean, var ** 0.5, image.shape)
out = image + noise
if out.min() < 0:
low_clip = -1.
else:
low_clip = 0.
out = np.clip(out, low_clip, 1.0)
out = np.uint8(out * 255)

cv2.imshow("noise", out)
filename3=str(number)+'n10'+'.jpg'
cv2.imwrite(savedpath + filename3, out)

# 图像亮度调节
def img_brightness(image):
contrast = 1 # 对比度
brightness = 100 # 亮度
pic_turn = cv2.addWeighted(image, contrast, image, 0, brightness)
# cv2.addWeighted(对象,对比度,对象,对比度)
'''cv2.addWeighted()实现的是图像透明度的改变与图像的叠加'''

cv2.imshow('bright', pic_turn) # 显示图片
filename3=str(number)+'n11'+'.jpg'
cv2.imwrite(savedpath + filename3, pic_turn)
if __name__ == '__main__':

i = 0
path = '../Data/'

print(path)
savedpath = './result_new/'

filelist = os.listdir(path)
total_num = len(filelist)

for item in filelist:
number = i + 1
i = number
print("######")
print("打印到第",i,"张图片")
src = cv2.imread(path + item)

img_translation(src)
img_scale(src)
img_flip(src)
img_rotation(src)
img_noise(src)
img_brightness(src)

cv2.waitKey(0)
cv2.destroyAllWindows()

代码较为繁琐,有空之后进行优化

输出结果
参考技术A 仅供参考
python中对象之间的赋值是按引用传递的,如果需要拷贝对象,需要用到标准库中的copy模块
方法一:利用 PIL 中的 Image 函数
这个函数读取出来不是 array 格式,这时候需要用 np.asarray(im) 或者 np.array()函数 。
区别:np.array() 是深拷贝,np.asarray() 是浅拷贝
copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。
copy.deepcopy 深拷贝 拷贝对象及其子对象
例子:
import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象
b = a #赋值,传对象的引用
c = copy.copy(a) #对象拷贝,浅拷贝
d = copy.deepcopy(a) #对象拷贝,深拷贝
a.append(5) #修改对象a
a[4].append('c') #修改对象a中的['a', 'b']数组对象
print 'a = ', a
print 'b = ', b
print 'c = ', c
print 'd = ', d
输出结果:
a = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c = [1, 2, 3, 4, ['a', 'b', 'c']]
d = [1, 2, 3, 4, ['a', 'b']]
需要好好理解一下深拷贝和浅拷贝
from PIL import Image
import numpy as np
I = Image.open('./cc_1.png')
I.show()
I.save('./save.png')
I_array = np.array(I)
print I_array.shape
方法二:利用 matplotlib
利用 matplotlib.pyplot as plt 用于显示图片
matplotlib.image as mpimg 用于读取图片
并且读取出来就是 array 格式
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
I = mpimg.imread('./cc_1.png')
print I.shape
plt.imshow(I)
方法三:利用 OpenCV-Python 接口
cv2.imread() 读出来同样是 array 形式,但是如果是单通道的图,读出来的是三通道的。
import cv2
I = cv2.imread('./cc_1.png')
print I.shape
方法四:图像处理库 Scipy
图像的存取笔者一般喜欢用 scipy 这个库里的东西
读出来是 array 形式,并且按照(H,W,C)形式保存
import matplotlib.pyplot as plt
from scipy import misc
import scipy
I = misc.imread('./cc_1.png')
scipy.misc.imsave('./save1.png', I)
plt.imshow(I)
plt.show()
方法五:用 skimage 库
from skimage import io,data
img=data.lena()
io.imshow(img)
关于存储方式主要用两种:
当对象是图片时,使用 object.save(path)函数
当对象时二维数组时,使用 misc.imsave(path,object)函数
python读取图片的5种方法使用非常简单,大家可以在自己机器上测试一下
文章知识点与官方知识档案匹配
Python入门技能树高级教程类
194350 人正在系统学习中
参考技术B 一开始我以为是图片大小比例不对,因而通过以下代码进行修改:

plt.figure(figsize=(10,8))

但是无论怎么修改,始终会出现这种情况,要么是下面显示不完全,要么就是左边显示不完全。这是为什么呢?

这是因为colorbar会占据右边位置,导致输出的图片偏左。

摸索了半天,最终解决方法是,在savefig()的参数中添加bbox_inches = 'tight'。

plt.colorbar()

plt.savefig(title, dpi=300, bbox_inches = 'tight')

plt.show()

完美解决!!!
参考技术C 查查看是否有隐藏的图片,数量不一致的话,最大的情况就是有隐藏的。

以上是关于python读取保存多帧图片数量少了的主要内容,如果未能解决你的问题,请参考以下文章

python怎么监测svn库的文件有更新

qt两个widget渲染相同

OpenCV 例程 300篇253. 多帧图像(动图)的读取与保存

OpenCV 例程 300篇253. 多帧图像(动图)的读取与保存

用Python编写录屏程序将播放的视频用截屏方法转换为多帧图像编辑后保存为GIF格式动图文件

用Python编写录屏程序将播放的视频用截屏方法转换为多帧图像编辑后保存为GIF格式动图文件