系列文章目录

《计算机视觉技术与应用》-----第二章 图像处理基础

《计算机视觉技术与应用》-----第三章 图形用户界面

《计算机视觉技术与应用》-----第四章 图像变换

《计算机视觉技术与应用》-----第五章 边缘和轮廓

《计算机视觉技术与应用》-----第六章 边缘和轮廓

《计算机视觉技术与应用》-----第七章 边缘和轮廓

《计算机视觉技术与应用》----- 重点复盘

文章目录

  • 系列文章目录
  • 前言
  • 一、读取图像
  • 二、写图像
  • 三、显示图像
  • 四、等待按键
  • 五、播放视频
  • 六 将视频写入文件
  • 八 捕获摄像头视频
  • 九 操作灰度图像
  • 十 操作彩色图像
  • 十一 通过数组索引拆分通道
  • 十二 使用cv2.split()函数拆分通道
  • 十三 合并图像通道
  • 十四 图像加法
  • 十五 加权加法运算
  • 十六 位运算
  • 十七 实验一:为人物图像打码
  • 十八 创建图像掩膜
  • 课后习题
  • 总结

前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、读取图像

#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 npimg = 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值->ESCbreak
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结束breaksuccess,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+=30img[:,:]=n #更改灰度值print(img[1,1])  #输出一个灰度值key = cv2.waitKey(1000) #延迟1Sif 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上三分之一颜色值设为255img[80:160,:,r1]=255                    #通道r1中部三分之一颜色值设为255img[160:,:,r2]=255                      #通道r2下三分之一颜色值设为255cv2.imshow('ColorImg',img)key=cv2.waitKey(1000)                   #延迟1秒img[:,:,:]=0                            #像素全部置0t=r0                                    #轮换通道序号r0=r1r1=r2r2=tif 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)

总结

本章重点

  1. “+”和cv2.add()区别是什么?
  2. 使用**cv2.split()**函数拆分通道。
  3. 捕获摄像头视频,在VideoCapture对象中,0表示默认摄像头。
  4. 等待按键函数 cv2.waitKey() K是大写。
  5. 读取图像函数,注意参数cv2.IMREAD_GRAYSCALE表示将图像转换为单通道灰度图像,cv2.IMREAD_REDUCED_COLOR_2 表示将图像转换为3通道BGR彩色图像,并且图像尺寸减小为1/2。
  6. OpenCV默认的图像格式为BGR
  7. 使用zeros()函数创建数组,数组元素默认值是0
  8. 注意为人物打码和创建掩膜操作。

《计算机视觉技术与应用》-----第二章 图像处理基础相关推荐

  1. 数字图像处理 第二章 图像处理基础

    数字图像处理基础 2.1 色度学基础 色度学 人的视觉特性 2.1.1 三基色原理 人眼的视网膜上存在有大量能在适当亮度下分辨颜色的锥状细胞,它们分别对应红.绿.蓝三种颜色,即分别对红光.绿光.蓝光敏 ...

  2. 数字图像处理--冈萨雷斯第4版--第二章 数字图像基础

    数字图像处理--冈萨雷斯版--第二章 第二章 数字图像基础 2.1 视觉感知要素 2.1.1 人眼的结构 2.1.2 人眼中图像的形成 2.1.3 亮度适应与辨别 2.2 光和电磁波谱 2.3 图像感 ...

  3. 数字图像处理 第二章数字图像基础

    第二章 数字图像基础 本章全都不是重点,了解就好 目标 人体视觉感知 光和电磁波谱 成像模型 图像取样与量化 一些基本概念和数学处理方法 人体视觉感知 人眼结构 上图为人眼剖面图. 人眼是一个直径约为 ...

  4. 《数字图像处理》第二章-数字图像基础 笔记

    参考文章: 数字图像处理(冈萨雷斯第三版)学习笔记 - Chapter 1 Introduction(1) 数字图像处理(冈萨雷斯第三版)学习笔记 - Chapter 1 Introduction(2 ...

  5. 数字图像处理笔记 第二章 数字图像基础 第一节 人眼视觉特性

    第二章 数字图像基础 第一节 人眼视觉特性 一.光与电磁波 可见光谱:380mm - 780mm 光谱图: 可见光范围内,不同波长的光给人不同的色彩感觉,不同强度的光及不同强度分布的光刺激人眼,在人脑 ...

  6. Python计算机视觉:第一章 图像处理基础

    第一章 图像处理基础 1.1 PIL-Python图像库 1.1.1 对图片进行格式转换 1.1.2 创建缩略图 1.1.3 拷贝并粘贴区域 1.1.4 调整尺寸及旋转 1.2 Matplotlib库 ...

  7. 数字图像识别学习笔记(第二章-数字图像基础(1))

    title: 数字图像识别学习笔记(第二章 数字图像基础(1)) categories: 数字图像识别 tags: 数字图像识别 date: 2020/9/30 21:22 mathjax: true ...

  8. 第一章图像处理基础概念(人眼和光)

    系列文章目录 第一章 图像处理基础概念 第二章 常见算法处理 第三章 灰度变化 第四章 空间滤波 第五章 频域滤波 第六章 色彩基础 第七章 小波和多分辨率 第八章 图像表示和描述 第九章 形态学图像 ...

  9. 《机器学习系列教程》:第二章 机器学习基础

    第二章 机器学习基础 机器学习and 数据分析 2.2 监督学习.非监督学习.半监督学习.弱监督学习? 根据数据类型的不同,对一个问题的建模有不同的方式.依据不同的学习方式和输入数据,机器学习主要分为 ...

最新文章

  1. python和R对dataframe的拼接、采样、链式操作:dplyr、tidyr、concat、rbind、cbind、sample、sample_n、set.seed、mutate、filter
  2. 升级IOS8游戏上传自定义头像功能失效的问题
  3. 算法入门书籍--算法图解
  4. leetcode127. 单词接龙(bfs)
  5. mysql日期纬度表_mysql中生成时间维度表
  6. Git工作流中常见的三种分支策略:GitFlow、GitHubFlow和GitLabFlow
  7. 程序员面试被问到“三次握手,四次挥手”怎么办?
  8. mysql-server rpm_Mysql rpm包安装
  9. c++ 第五次作业(计算器第三步)
  10. 如何在 Google 免费云端运行 Python 深度学习框架?
  11. 深度学习与自动驾驶领域的数据集(KITTI,Oxford,Cityscape,Comma.ai,BDDV,TORCS,Udacity,GTA,CARLA,Carcraft)
  12. WiFi大师小程序3.0.9独立版源码
  13. HTML+CSS十分钟实现响应式布局页面,响应式布局实战教程
  14. DNA存储技术创造新纪录 存储容量已达200MB
  15. 蓝白屌丝卡过NAXX蜘蛛区英雄模式
  16. 贵溪市网络营销信息源类别
  17. uniapp判断当前运行环境 app h5 微信小程序
  18. 怎么样做能让站点文章收录更快一些呢
  19. 小学语文三年级阅读理解专项练习附答案~寓言二则
  20. SCL定时 1500_西门子SCL编程实例 | 多个灯的逻辑控制程序

热门文章

  1. 2.2.1新增-contentEditable属性
  2. UVa 10557 - XYZZY
  3. 饿了么CFO徐舸被架空:阿里派人直接出任 协助王磊
  4. Windows DLL编程中的导入导出:__declspec(dllimport) ,__declspec(dllexport) ,
  5. 解决棘手SQL性能问题,我的SQLT使用心得
  6. 使用Alluxio高效存储Spark RDD
  7. 模拟1688(跨境产品开发工具)滑块验证码案例
  8. InfoQ网站作者的文章列表文章详情获取-Java网络爬虫系统性学习与实战系列(13)
  9. 【KKT】∇f(x)+λ∇g(x)=0中λ的讨论
  10. 导航栏随屏幕移动而变化