系列文章目录
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、读取图像
#test2-1 读取图像
import cv2
#img = cv2.imread('lena.jpg')#只需要写图片的相对路径
img = cv2.imread('lena.jpg',cv2.IMREAD_REDUCED_GRAYSCALE_4)#只需要写图片的相对路径
print("输出内容:")
print(type(img))
print(img)#输出图像数组
print(img.shape)#输出数组形状
print(img.dtype)#输出数组元素的类型
print(img.size)#输出数组元素个数
二、写图像
#t2-2.py 将图像存入文件
import cv2
import numpy as np
img = np.zeros((100,100),dtype=np.uint8)+255#创建大小为100*100的黑色正方形图像
cv2.imwrite('t2-2.jpg',img)#将创建的白色图片命名为t2-2.jpg存入文件中
三、显示图像
#t2-3.py 显示图像
import cv2
img = cv2.imread('lena.jpg',cv2.IMREAD_REDUCED_COLOR_2)#将读取到图像
#转换为BGR模式,再缩减为原来的1/2
cv2.imshow('lena',img) #显示图像
cv2.waitKey() #等待显示图片
四、等待按键
#test2-4.py:等待按键
import cv2
img=cv2.imread('lena.jpg',cv2.IMREAD_REDUCED_COLOR_2) #读取图像,缩小为原来的1/2
cv2.imshow('lena',img) #显示图像
key=0
while key!=27: #按Esc键时终止循环
key=cv2.waitKey() #等待按键
cv2.destroyWindow('lena') #关闭图像窗口
五、播放视频
#t2-5.py 播放视频
from tkinter import Frame
import cv2
vc = cv2.VideoCapture('test2-5.mp4') #创建videoCapture对象
fps = vc.get(cv2.CAP_PROP_FPS) #帧
size = (vc.get(cv2.CAP_PROP_FRAME_HEIGHT),
vc.get(cv2.CAP_PROP_FRAME_WIDTH)
)#读取视频大小
print('帧率:',fps)
print('大小:',size)
success,frame = vc.read() #读第一帧
while success:
cv2.imshow('test2-5video',frame) #在窗口中显示图片
success,frame = vc.read() #继续下一帧读取
key=cv2.waitKey(25)
if key == 27: #ASCII值->ESC
break
vc.release() #关闭视频 这里要注意一下,不用缩进
六 将视频写入文件
#t2-6.py 将视频写入文件
import cv2
vc = cv2.VideoCapture('test2-5.mp4') #创建VideoCapture对象
fps = vc.get(cv2.CAP_PROP_FPS) #读取视频帧率
size = (int(vc.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(vc.get(cv2.CAP_PROP_FRAME_HEIGHT))) #读取视频大小
vw = cv2.VideoWriter('t2-6out.avi',cv2.VideoWriter_fourcc('X','V','I','D')
,fps,size) #设置视频解码器格式
success,frame = vc.read()
while success:
vw.write(frame) #将帧写入文件
success,frame = vc.read() #读取下一帧
vc.release() #关闭视频
八 捕获摄像头视频
#t2-7.py 将摄像头拍摄的视频保存到文件中
import cv2
vc = cv2.VideoCapture(0) #创建VideoCapture对象,视频流默认(0)是摄像头
fps = 30 #读取视频帧率
size = (int(vc.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(vc.get(cv2.CAP_PROP_FRAME_HEIGHT))) #设置视频大小
vw = cv2.VideoWriter('t2-7out.avi',cv2.VideoWriter_fourcc('X','V','I','D')
,fps,size) #设置视频解码器格式
success,frame = vc.read() #读第一帧
while success:
vw.write(frame) #将帧写入文件
cv2.imshow('MyCamera',frame) #显示帧
key = cv2.waitKey(30) #需要设置一个参数,不然就会卡住
if key == 27: #按ESC结束
break
success,frame = vc.read() #读取下一帧
vc.release() #关闭视频
九 操作灰度图像
#t2-8.py 操作灰度图像
import cv2
import numpy as np
img = np.zeros((640,480),dtype=np.uint8) #创建240*320黑色图像
n = 0
while True:
cv2.imshow('GrayImg',img)
n+=30
img[:,:]=n #更改灰度值
print(img[1,1]) #输出一个灰度值
key = cv2.waitKey(1000) #延迟1S
if key == 27:
break
十 操作彩色图像
#test2-9.py:操作彩色图像
#创建一幅彩色图像,图像的上、中、下三个部分依次为蓝色、绿色和红色,
#程序每隔1秒钟轮换三个部分的颜色。
import cv2
import numpy
img=numpy.zeros((240,320,3),dtype=numpy.uint8) #创建图像
r0=0
r1=1
r2=2
while True:
img[:80,:,r0]=255 #通道r0上三分之一颜色值设为255
img[80:160,:,r1]=255 #通道r1中部三分之一颜色值设为255
img[160:,:,r2]=255 #通道r2下三分之一颜色值设为255
cv2.imshow('ColorImg',img)
key=cv2.waitKey(1000) #延迟1秒
img[:,:,:]=0 #像素全部置0
t=r0 #轮换通道序号
r0=r1
r1=r2
r2=t
if key==27:
break #按【Esc】键结束
十一 通过数组索引拆分通道
#test2-10.py:通过数组索引拆分通道
import cv2
img=cv2.imread('lena.jpg',cv2.IMREAD_REDUCED_COLOR_2) #读取图像,缩小为原来的1/2
cv2.imshow('lena',img) #显示原图像
b=img[:,:,0] #获得B通道图像 也就是蓝色分量图像;
g=img[:,:,1] #获得G通道图像 也就是绿色分量图像;
r=img[:,:,2] #获得R通道图像 也就是红色分量图像;
cv2.imshow('lena_B',b) #显示B通道图像
cv2.imshow('lena_G',g) #显示G通道图像
cv2.imshow('lena_R',r) #显示R通道图像
cv2.waitKey(0)
十二 使用cv2.split()函数拆分通道
#test2-11.py:使用cv2.split()函数拆分通道
import cv2
img=cv2.imread('lena.jpg',cv2.IMREAD_REDUCED_COLOR_2) #读取图像,缩小为原来的1/2
cv2.imshow('lena',img) #显示原图像
b,g,r=cv2.split(img) #按通道拆分图像
cv2.imshow('lena_B',b) #显示B通道图像
cv2.imshow('lena_G',g) #显示G通道图像
cv2.imshow('lena_R',r) #显示R通道图像
cv2.waitKey(0)
十三 合并图像通道
#test2-12.py:合并图像通道
import cv2
img=cv2.imread('lena.jpg',cv2.IMREAD_REDUCED_COLOR_2)#读图像,缩小为原来的1/2
cv2.imshow('lena',img) #显示原图像
b,g,r=cv2.split(img) #按通道拆分图像
rgb=cv2.merge([r,g,b]) #按新顺序合并
gbr=cv2.merge([g,b,r]) #按新顺序合并
grb=cv2.merge([g,r,b]) #按新顺序合并
cv2.imshow('lena_RGB',rgb) #显示合并图像
cv2.imshow('lena_GBR',gbr) #显示合并图像
cv2.imshow('lena_GRB',grb) #显示合并图像
cv2.waitKey(0)
十四 图像加法
#test2-13.py:图像加法运算
import cv2
img1=cv2.imread('lena.jpg',cv2.IMREAD_REDUCED_COLOR_2) #读取图像
img2=cv2.imread('opencvlog.jpg',cv2.IMREAD_REDUCED_COLOR_2) #读取图像
img3=img1+img2 #加号
img4=cv2.add(img1,img2) #cv2.add()函数
cv2.imshow('lena',img1) #显示原图像
cv2.imshow('log',img2) #显示原图像
cv2.imshow('lena+log',img3) #显示“+”图像
cv2.imshow('lenaaddlog',img4) #显示add()图像
cv2.waitKey(0)
十五 加权加法运算
#test2-14.py:图像的加权加法运算
import cv2
img1=cv2.imread('lena.jpg',cv2.IMREAD_REDUCED_COLOR_2) #读取图像
img2=cv2.imread('opencvlog.jpg',cv2.IMREAD_REDUCED_COLOR_2) #读取图像
img3=cv2.addWeighted(img1,0.6,img2,0.7,10)
cv2.imshow('lena',img1) #显示原图像
cv2.imshow('log',img2) #显示原图像
cv2.imshow('lena+log',img3) #显示addWeighted()图像
cv2.waitKey(0)
十六 位运算
#test2-15.py:图像位运算
import cv2
src1=cv2.imread('lena.jpg',cv2.IMREAD_REDUCED_COLOR_2) #读取图像
src2=cv2.imread('opencvlog.jpg',cv2.IMREAD_REDUCED_COLOR_2) #读取图像
img3=cv2.bitwise_and(src1,src2)#按位与
img4=cv2.bitwise_or(src1,src2)#按位或
img5=cv2.bitwise_not(src1)#按位取反
img6=cv2.bitwise_xor(src1,src2)#按位异或
cv2.imshow('lena',src1) #显示原图像
cv2.imshow('log',src2) #显示原图像
cv2.imshow('lenaandlog',img3) #显示按位与图像
cv2.imshow('lenaorlog',img4) #显示按位或图像
cv2.imshow('lenanotlog',img5) #显示按位取反图像
cv2.imshow('lenaxorlog',img6) #显示按位异或图像
cv2.waitKey(0)
十七 实验一:为人物图像打码
#test2-16.py:实验1:为人物图像打码
import cv2
src1=cv2.imread('lena.jpg') #读取图像
cv2.imshow('lena',src1) #显示原图像
src1[240:280,230:380]=200 #更改像素,眼部打码
cv2.imshow('dama',src1) #显示打码图像
cv2.waitKey(0)
十八 创建图像掩膜
#test2-17.py:实验2:创建图像掩模
import cv2
src1=cv2.imread('lena.jpg') #读取图像
src2=cv2.imread('lenamask.jpg')#读取图像
img3=cv2.bitwise_and(src1,src2) #按位与
cv2.imshow('lena',src1) #显示原图像
cv2.imshow('mask',src2) #显示掩模图像
cv2.imshow('done',img3) #显示按位与图像
cv2.waitKey(0)
课后习题
1.习题2-1.py:创建一幅大小为240×320的图像,图像中心是一个大小为100×100的红色正方形,周围是黑色
import numpy
import cv2
img=numpy.zeros((240,320,3),dtype=numpy.uint8) #0-255
img[70:170,110:210,2]=255 #img[:, :, 0] / img[:, :, 1] / img[:, :, 2]:表示图像单个通道的像素
cv2.imshow('xiti2-1',img)
cv2.waitKey(0)
2.习题2-2.py:选择一幅彩色图像,完成下列操作:
(1)将图像转换为灰度图像显示。
(2)将图像尺寸减小为原来的1/2显示。
import cv2
img=cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE) #读取、转换为灰度图像
cv2.imshow('GRAYSCALE',img) #显示灰度图像
img=cv2.imread('lena.jpg',cv2.IMREAD_REDUCED_COLOR_2) #读取、转换原大小1/2
cv2.imshow('COLOR_2',img) #显示缩小的图像
cv2.waitKey(0)
3.习题2-3.py:选择一幅彩色图像,通过像素更改,在图像中显示一个大小为80×100的黑色正方形。
import cv2
img=cv2.imread('lena.jpg')
h,w,s=img.shape
h1=int(h/2)
w1=int(w/2)
img[h1-40:h1+41,w1-50:w1+51,:]=0
cv2.imshow('blacksquare',img)
cv2.waitKey(0)
4.习题2-4.py:选择一幅彩色图像,分别显示其B、G、R通道图像。
import cv2
img=cv2.imread('lena.jpg') #读图像
cv2.imshow('lena',img) #显示原图像
b,g,r=cv2.split(img) #按通道拆分图像
cv2.imshow('lena_B',b) #显示B通道图像
cv2.imshow('lena_G',g) #显示G通道图像
cv2.imshow('lena_R',r) #显示R通道图像
cv2.waitKey(0)
5.习题2-5.py:选择一幅彩色图像,用NumPy数组创建掩模,在图像中心取出大小为80×120的图像。
import cv2
import numpy
src1=cv2.imread('lena.jpg')
h,w,s=src1.shape
img=numpy.zeros((h,w,s),dtype=numpy.uint8)
h1=int(h/2)
w1=int(w/2)
img[h1-40:h1+41,w1-60:w1+61,:]=255
img2=cv2.bitwise_and(src1,img)
cv2.imshow('done',img2)
cv2.waitKey(0)
总结
本章重点
- “+”和cv2.add()区别是什么?
- 使用**cv2.split()**函数拆分通道。
- 捕获摄像头视频,在VideoCapture对象中,0表示默认摄像头。
- 等待按键函数 cv2.waitKey() K是大写。
- 读取图像函数,注意参数cv2.IMREAD_GRAYSCALE表示将图像转换为单通道灰度图像,cv2.IMREAD_REDUCED_COLOR_2 表示将图像转换为3通道BGR彩色图像,并且图像尺寸减小为1/2。
- OpenCV默认的图像格式为BGR。
- 使用zeros()函数创建数组,数组元素默认值是0。
- 注意为人物打码和创建掩膜操作。