目录
一、os模块
常用函数:
二、视频处理
1、视频逐帧导出图片(OpenCV)
操作步骤:
完整代码:
运行结果:
2、图片逐帧合成视频(FFMpeg)
合成视频:
播放视频:
三、图像处理
1、打开图像文件
问题记录:
完整代码:
运行结果:
函数使用:
2、复制并粘贴图像区域(简单换眼)
操作步骤:
部分代码:
运行结果:
函数使用:
3、图像轮廓和直方图
完整代码:
运行结果:
参数含义:
4、高斯模糊
完整代码:
运行结果:
5、Sobel算子
完整代码:
运行结果:
6、图像分割
完整代码:
运行结果:
7、负片效果
完整代码:
运行结果:
一、os模块
常用函数:
os.listdir():
os.listdir(path) #返回指定的文件夹包含的文件或文件夹的名字的列表
for file in dirs:
print(file)
os.getcwd():
print(os.getcwd()) #获取当前路径
os.chdir():
os.chdir(path) #改变当前目录到指定目录中
os.mkdir(dir_name):
dir_name = "./images" #新建文件夹
if not os.path.exists(dir_name): #判断文件夹是否存在
os.mkdir(dir_name)
os.makedirs(dir_name2,exist_ok=True):
dir_name2 = "./images2/imgs2" #可以递归的创建多个文件夹 os.makedirs(dir_name2, exist_ok=True) #当文件夹已经存在就不创建
二、视频处理
1、视频逐帧导出图片(OpenCV)
操作步骤:
- cv2.VideoCapture()打开视频,.get(cv2.CAP_PROP_frame_COUNT)获取帧数信息
- 逐帧打印(灰度)图片,cv2.imwrite()保存图像
完整代码:
import cv2
video_path='ghz.mp4'
image_save='./pic' #os.mkdir()或手动创建文件夹
cap=cv2.VideoCapture(video_path)
video_frame_count=cap.get(cv2.CAP_PROP_frame_COUNT) #获取视频帧数信息
for i in range(int(video_frame_count)):
_, img = cap.read()
img=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #转换成灰度图片
cv2.imwrite('./pic/image{}.jpg'.format(i),img)
运行结果:
操作步骤:
- cv2.VideoCapture()打开视频,.get(cv2.CAP_PROP_frame_COUNT)获取帧数信息
- 逐帧打印(灰度)图片,cv2.imwrite()保存图像
完整代码:
import cv2
video_path='ghz.mp4'
image_save='./pic' #os.mkdir()或手动创建文件夹
cap=cv2.VideoCapture(video_path)
video_frame_count=cap.get(cv2.CAP_PROP_frame_COUNT) #获取视频帧数信息
for i in range(int(video_frame_count)):
_, img = cap.read()
img=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #转换成灰度图片
cv2.imwrite('./pic/image{}.jpg'.format(i),img)
运行结果:
import cv2
video_path='ghz.mp4'
image_save='./pic' #os.mkdir()或手动创建文件夹
cap=cv2.VideoCapture(video_path)
video_frame_count=cap.get(cv2.CAP_PROP_frame_COUNT) #获取视频帧数信息
for i in range(int(video_frame_count)):
_, img = cap.read()
img=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #转换成灰度图片
cv2.imwrite('./pic/image{}.jpg'.format(i),img)
运行结果:
2、图片逐帧合成视频(FFMpeg)
合成视频:
D:python learningopencv>"./ffmpeg/bin/ffmpeg.exe" -f image2 -i ./pic/image%d.jpg -r 24 output.mp4
播放视频:
ffplay output.mp4(ffplay.exe与视频放在同一目录下)
三、图像处理
1、打开图像文件
问题记录:
问题记录:
生成的灰度图呈绿色,解决方法:为plt.imshow()添加参数cmap=“gray”
完整代码:from PIL import Image
from pylab import *
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:windowsfontsSimSun.ttc", size=14)
figure()
im1=Image.open('girl.png')
print(im1.format,im1.size,im1.mode)
plt.title(u'原图',fontproperties=font)
plt.imshow(im1)
plt.axis('off')
plt.show()
im2= Image.open('girl.png').convert('L') #转换成灰度图
print(im2.format,im2.size,im2.mode)
title(u'灰度图',fontproperties=font)
plt.imshow(im2,cmap='gray')
plt.axis('off')
plt.show()
运行结果:
函数使用:
convert()函数用于不同模式图像之间的转换:
PIL中有九种不同模式,分别为1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
模式“1” 二值图像,非黑即白;每个像素用1个bit表示,0表示黑,255表示白
模式“L” 灰色图像,每个像素用8个bit表示,数字表示不同的灰度
模式“P” 彩色图像,每个像素用8个bit表示,其对应的彩色值是按照调色板查询出来的
模式“RGBA” 彩色图像,每个像素用32个bit表示,其中24bit表示红色、绿色和蓝色三个通道,另外8bit表示alpha通道(透明通道)
模式“CMYK” 彩色图像,每个像素用32个bit表示,印刷四分色模式
2、复制并粘贴图像区域(简单换眼)
操作步骤:
- 使用detector进行人脸检测,打印人脸的5个标定点坐标
- 显示原图,判断人眼的区域
- 复制原图1的眼睛区域,粘贴到原图2的眼睛区域
部分代码:
from PIL import Image
from pylab import *
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:windowsfontsSimSun.ttc", size=14) #添加中文字体支持
figure()
pil_im = Image.open('yyqx.jpg')
print(pil_im.mode, pil_im.size, pil_im.format)
title(u'原图1', fontproperties=font)
axis('off')
imshow(pil_im)
show()
pil_im2 = Image.open('Emma.jpg')
print(pil_im2.mode, pil_im2.size, pil_im2.format)
title(u'原图2', fontproperties=font)
axis('off')
imshow(pil_im2)
show()
pil_im = Image.open('yyqx.jpg')
box = (180, 255, 225, 270) #数值通过人脸五个标定点的坐标获取
region = pil_im.crop(box)
box2=(192,234,237,249) #数值通过人脸五个标定点的坐标获取
pil_im2.paste(region, box2) #复制并粘贴区域
title(u'换眼后', fontproperties=font)
axis('off')
imshow(pil_im2)
运行结果:
函数使用:
部分代码:
from PIL import Image
from pylab import *
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:windowsfontsSimSun.ttc", size=14) #添加中文字体支持
figure()
pil_im = Image.open('yyqx.jpg')
print(pil_im.mode, pil_im.size, pil_im.format)
title(u'原图1', fontproperties=font)
axis('off')
imshow(pil_im)
show()
pil_im2 = Image.open('Emma.jpg')
print(pil_im2.mode, pil_im2.size, pil_im2.format)
title(u'原图2', fontproperties=font)
axis('off')
imshow(pil_im2)
show()
pil_im = Image.open('yyqx.jpg')
box = (180, 255, 225, 270) #数值通过人脸五个标定点的坐标获取
region = pil_im.crop(box)
box2=(192,234,237,249) #数值通过人脸五个标定点的坐标获取
pil_im2.paste(region, box2) #复制并粘贴区域
title(u'换眼后', fontproperties=font)
axis('off')
imshow(pil_im2)
运行结果:
使用 crop() 方法可以从一幅图像中裁剪指定区域:
box = (100,100,400,400)
region = pil_im.crop(box)
该区域使用四元组来指定。四元组的坐标依次是(左,上,右,下)。PIL 中指定坐标系的左上角坐标为(0,0)。
可以旋转上面代码中获取的区域,然后使用paste() 方法将该区域放回去:
region = region.transpose(Image.ROTATE_180)
pil_im.paste(region,box)
3、图像轮廓和直方图
完整代码:
from PIL import Image
from pylab import *
import matplotlib.pyplot as plt
im=array(Image.open('girl.png').convert('L')) #读取图像到数组中
figure() #新建一个图像
gray() #不使用颜色信息
contour(im,origin='image') #在原点的左上角显示轮廓图像
axis('equal')
axis('off')
figure()
hist(im.flatten(),128)
show()
运行结果:
参数含义:
hist(x[, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, hold, **kwargs])
x 作直方图所要用的数据,必须是一维数组(多维数组可以先进行扁平化再作图)
bins 直方图的柱数,可选项,默认为10
4、高斯模糊
完整代码:
from numpy import *
from scipy.ndimage import filters
from PIL import Image
import matplotlib.pyplot as plt
im=array(Image.open('girl.png').convert('L'))
im2=filters.gaussian_filter(im,5) #第二个参数sigma值越大,滤波之后的图像越模糊
plt.figure()
plt.imshow(im2)
plt.show()
运行结果:
5、Sobel算子
sobel算子是图像边缘检测的最重要的算子之一
完整代码:
from PIL import Image
from numpy import *
from scipy.ndimage import filters
import matplotlib.pyplot as plt
from pylab import *
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:windowsfontsSimSun.ttc", size=14)
figure()
im=array(Image.open('girl.png').convert('L'))
imx=zeros(im.shape)
filters.sobel(im,1,imx) #sobel()第二个参数表示选择x或者y方向导数,第三个参数保存输出的变量
subplot(1,4,2)
plt.imshow(imx,cmap='gray')
axis("off")
title(u'x导数图像', FontProperties=font)
imy=zeros(im.shape)
filters.sobel(im,0,imy)
subplot(1,4,3)
plt.imshow(imy,cmap='gray')
axis("off")
title(u'y导数图像', FontProperties=font)
magnitude=sqrt(imx**2+imy**2)
subplot(1,4,4)
plt.imshow(magnitude,cmap='gray')
axis("off")
title(u'梯度大小图像', FontProperties=font)
show()
运行结果:
(正导数显示为亮的像素,负导数显示为暗的像素,灰色区域表示导数的值接近于零)



