栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python学习 | 2021-10-08 图频处理

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python学习 | 2021-10-08 图频处理

目录

一、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)

操作步骤:
  1. cv2.VideoCapture()打开视频,.get(cv2.CAP_PROP_frame_COUNT)获取帧数信息
  2. 逐帧打印(灰度)图片,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)

运行结果: 

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、复制并粘贴图像区域(简单换眼) 操作步骤:
  1. 使用detector进行人脸检测,打印人脸的5个标定点坐标
  2. 显示原图,判断人眼的区域
  3. 复制原图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)
运行结果:

函数使用:

使用 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()
运行结果:

 (正导数显示为亮的像素,负导数显示为暗的像素,灰色区域表示导数的值接近于零)

6、图像分割  完整代码:
from PIL import Image
from numpy import *
from scipy.ndimage import measurements
import matplotlib.pyplot as plt

im=array(Image.open('girl.png').convert('L'))    #载入图像,使用阈值化操作,以保证处理的图像为二值图像
im=1*(im<128)    #通过和1相乘,将布尔数组转换成二进制表示
labels,nbrobjects=measurements.label(im)    #用label()函数寻找单个的物体,并按照它们属于哪个对象将整数标签给像素赋值
print("对象个数=",nbrobjects)

plt.figure()
plt.imshow(im)
plt.show()
运行结果:

7、负片效果 完整代码:
from PIL import Image
import matplotlib.pyplot as plt

im=array(Image.open('girl.png'))
im2=255-im    #逐像素修改
plt.figure()
plt.imshow(im2)
plt.show()
运行结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/313821.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号