OpenCV图像基本操作

1. 读取图像

img = cv2.imread( filepath , flags )

参数:

  • filepath:要读入图片的完整路径

  • flags:读入图片的标志

    cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道

    cv2.IMREAD_GRAYSCALE:读入灰度图片
    cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通道

import cv2
img = cv2.imread('../image/lena.jpg')

2. 读取视频

cv2.VideoCapture( )

  • cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。
  • 如果是视频文件,直接指定好路径即可。

读取视频

import cv2

vc = cv2.VideoCapture('../test.mp4')
# 检查是否打开正确
if vc.isOpened(): 
    ret, frame = vc.read()
else:
    open = False
while open:
    ret, frame = vc.read()
    if frame is None:
        break
    if ret == True:
        gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY)
        cv2.imshow('result', gray)
        if cv2.waitKey(10) & 0xFF == 27:
            break
vc.release()
cv2.destroyAllWindows()
  • cap = cv2.VideoCapture(0)
    参数0表示默认为笔记本的内置第一个摄像头,如果需要读取已有的视频则参数改为视频所在路径路径,例如:cap=cv2.VideoCapture(‘video.mp4’)

  • cap.isOpened()
    判断视频对象是否成功读取,成功读取视频对象返回True。

  • ret,frame = cap.read()
    说按帧读取视频,返回值ret是布尔型,正确读取则返回True,读取失败或读取视频结尾则会返回False。frame为每一帧的图像,这里图像是三维矩阵,即frame.shape = (640,480,3),读取的图像为BGR格式。

  • key = cv2.waitKey(1)
    等待键盘输入,参数1表示延时1ms切换到下一帧,参数为0表示显示当前帧,相当于暂停。

读取摄像头并保存视频

import cv2
 
def videocapture():
    cap=cv2.VideoCapture(0)     #生成读取摄像头对象
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  #获取视频的宽度
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  #获取视频的高度
    fps = cap.get(cv2.CAP_PROP_FPS) #获取视频的帧率
    fourcc = int(cap.get(cv2.CAP_PROP_FOURCC))    #视频的编码
    #定义视频对象输出
    writer = cv2.VideoWriter("video_result.mp4", fourcc, fps, (width, height))
    while cap.isOpened():
        ret, frame = cap.read() #读取摄像头画面
        cv2.imshow('teswell', frame) #显示画面
        key = cv2.waitKey(24)
        writer.write(frame)  #视频保存
        # 按Q退出
        if key == ord('q'):
            break
    cap.release()         #释放摄像头
    cv2.destroyAllWindows() #释放所有显示图像窗口
 
videocapture()

3. 显示图像

cv2.imshow( fname , img)

参数:

  • fname:显示图像的窗口的名字
  • img:要显示的图像(imread读入的图像),窗口大小自动调整为图片大小
import cv2

img = cv2.imread('../image/lena.jpg')

#显示图片
def cv_show(name , img):
    cv2.imshow(name,img)
    cv2.waitKey(0) #等待时间,单位毫秒,0为任意键终止
    cv2.destroyAllWindows() #销毁所有窗口
cv_show('image' , img)

cv2.waitkey(time):time为等待时间,单位毫秒,等待时间内有键盘输入则返回按键ASCII码,超时返回-1;time=0为任意键终止。

cv2.destroyAllWindows() 销毁所有窗口

cv2.destroyWindow(wname) 销毁指定窗口

4. 保存图像

cv2.imwrite( file,img,num )

参数:

  • file:要保存的文件名

  • img:要保存的图像。

  • num:可选的第三个参数,针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别,默认为3。

    cv2.IMWRITE_JPEG_QUALITY类型为 long ,必须转换成 int

    cv2.imwrite('lena.png' , img , [int( cv2.IMWRITE_JPEG_QUALITY), 95])
    

    cv2.IMWRITE_PNG_COMPRESSION, 从0到9 压缩级别越高图像越小

    cv2.imwrite( "lena.png" , img , [int(cv2.IMWRITE_PNG_COMPRESSION),9]  )
    

5. 翻转图像

cv2.flip( img , flipcode )

  • img:要翻转的图像
  • flipcode:控制翻转效果。
    flipcode = 0:沿x轴翻转
    flipcode > 0:沿y轴翻转
    flipcode < 0:x,y轴同时翻转
imgflip = cv2.flip(img,1)

6. 复制图像

imgcopy = img.copy()

7. 颜色空间转换

彩色图像转为灰度图像

img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)

灰度图像转为彩色图像

img = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)

8. 截取部分图像

img[y0:y1, x0:x1]

img=cv2.imread('cat.jpg')
cat=img[0:50,0:200] 

在这里插入图片描述

9. 颜色通道提取

  • 颜色通道提取
    b,g,r=cv2.split(img)

    分离出来的RGB三通道是灰度图

  • 合并通道

    img=cv2.merge((b,g,r))

  • 只保留R

    cur_img = img.copy()
    cur_img[:,:,0] = 0
    cur_img[:,:,1] = 0
    cv_show('R',cur_img)
    
  • 只保留G

    cur_img = img.copy()
    cur_img[:,:,0] = 0
    cur_img[:,:,2] = 0
    cv_show('G',cur_img)
    
  • 只保留B

    cur_img = img.copy()
    cur_img[:,:,1] = 0
    cur_img[:,:,2] = 0
    cv_show('B',cur_img)
    

在这里插入图片描述

10. 边界填充

cv2.copyMakeBorder( img , top , bottom , left , right , borderType)

参数:

  • src : 输入的图片

  • top, bottom, left, right :相应方向上的边框宽度

  • borderType:定义要添加边框的类型,它可以是以下的一种:

    • BORDER_REPLICATE:复制法,也就是复制最边缘像素。
    • BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
    • BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
    • BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
    • BORDER_CONSTANT:常量法,常数值填充。
import cv2
import matplotlib.pyplot as plt

img=cv2.imread('../image/cat.jpg')
top_size,bottom_size,left_size,right_size = (50,50,50,50)

replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)


plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')

plt.show()

在这里插入图片描述

11. 图像缩放

dst = cv2.resize(src,dsize,dst=None,fx=None,fy=None,interpolation=None)

参数:

  • src:输入图像
  • dsize:输出图像的大小。如果该参数为 0,表示缩放之后的大小需要通过公式计算,dsize = Size(round(fx*src.cols),round(fy*src.rows))。其中 fxfy 是图像 Width 方向和 Height 方向的缩放比例。
  • fx:Width 方向的缩放比例,如果是 0,按照 dsize * width/src.cols 计算
  • fy:Height 方向的缩放比例,如果是 0,按照 dsize * height/src.rows 计算
  • interpolation:插值算法类型,或者叫做插值方式,默认为双线性插值

方法返回结果 dst 表示输出图像。

import cv2
import matplotlib.pyplot as plt

cat = cv2.imread('../image/cat.jpg')
ltcat =  cv2.resize(cat, (0, 0), fx=0.5, fy=0.5)
plt.subplot(121), plt.imshow(cat, 'gray'), plt.title('cat')
plt.subplot(122), plt.imshow(ltcat, 'gray'), plt.title('ltcat')
plt.show()

在这里插入图片描述

12. 图像融合

cv2.addWeighted(img1, alpha, img2, beta, gamma[, dst[, dtype]])

alpha * img1 + beta * img2 + gamma

参数:

  • img1,img2:为读取的图像
  • alpha:为img1的透明度
  • beta:img2的透明度
import cv2
import matplotlib.pyplot as plt

cat=cv2.imread('../image/cat.jpg')
dog=cv2.imread('../image/dog.jpg')


#图像融合
dog = cv2.resize(dog, (500, 414))
cat = cv2.resize(cat, (500, 414))

img = cv2.addWeighted(cat, 0.4, dog, 0.6, 0)
img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5) #调整大小

plt.subplot(141), plt.imshow(cat, 'gray'), plt.title('cat')
plt.subplot(142), plt.imshow(dog, 'gray'), plt.title('dog')
plt.subplot(143), plt.imshow(cat+dog, 'gray'), plt.title('cat+dog')
plt.subplot(144), plt.imshow(img, 'gray'), plt.title('addWeighted')
plt.show()

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值