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

系列文章目录

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

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

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

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

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

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

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


前言

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

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

扫描二维码关注公众号,回复: 16957888 查看本文章

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

一、读取图像

在这里插入图片描述

#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)

总结

本章重点

  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. 注意为人物打码和创建掩膜操作。

猜你喜欢

转载自blog.csdn.net/xiaoren886/article/details/127610136