Python_08OpenCV图像处理

2020/08/01

Python_OpenCV图像处理

  • 1、什么是图像?
  • 2、什么是OpenCV?
  • 3、如何加载和显示图像?
    • (1)读取图片
    • (2)加载图片属性
    • (3)加载视频
    • (4)保存图片和视频
  • 4、numpy
  • 5、如何处理图像每一个像素点?
    • (1)如何读取图像的属性?
    • (2)如何循环获取每一个像素点并进行修改,再重新赋回去并显示处理?
    • (3)如何预估循环获取每一个像素点CPU运行的时间?
  • 6、如何自己创建一个新的图像?
    • (1)创建多通道的图像
    • (2)创建单通道的图像
  • 7、类型转换,维度转换
    • (1)类型转换
    • (2)维度转换
    • (3)数组fill()方法
hon_OpenCV图像处理)

1、什么是图像?

图像就是结构化存储的数据信息;图像属性(通道数目,高与宽,像素数据,图像类型)

2、什么是OpenCV?

Python中加载图像的模块与API;支持常见格式

3、如何加载和显示图像?

(1)读取图片

Python_08OpenCV图像处理_第1张图片

图3.1

(2)加载图片属性

Python_08OpenCV图像处理_第2张图片

图3.2.1

在这里插入图片描述

图3.2.2

运行结果:
Python_08OpenCV图像处理_第3张图片

图3.2.3

(3)加载视频

Python_08OpenCV图像处理_第4张图片

图3.3

★注意:opencv读视频时是分析视频的内容,对视频每一帧进行处理,对内容进行视频分析对象检测对象跟踪,所有opencv对的视频都是没有声音的,且对视频大小有一定的限制

(4)保存图片和视频

在这里插入图片描述

图3.4

4、numpy

见文档

5、如何处理图像每一个像素点?

(1)如何读取图像的属性?

Python_08OpenCV图像处理_第5张图片

图5.1.1

运行结果:
Python_08OpenCV图像处理_第6张图片

图5.1.2

(2)如何循环获取每一个像素点并进行修改,再重新赋回去并显示处理?

在图5.1.1的第12行代码后面加上一下代码,如图5.2.1所示
Python_08OpenCV图像处理_第7张图片

图5.2
    for row in range(height):               #遍历数组
        for col in range (width):
            for c in range(channels):
                pv = image[row,col,c]       #获取每个通道的每个数值,c维数组
                image[row,col,c] = 255 - pv #255减去 高、宽、维度,得到新的
    cv.imshow("pixels_demo",image)          #显示图片,pixels_demo是窗口名,image是图片

图5.2代码

利用OpenCV的API实现图像取反,可以大大缩短程序运行时间,实现代码如下所示

def inverse(image):
    dst = cv.bitwise_not(image)
    cv.imshow("pixels_demo", image)

(3)如何预估循环获取每一个像素点CPU运行的时间?

在图5.1.1的第17行代码后面加上一下代码,如图5.3所示
Python_08OpenCV图像处理_第8张图片

图5.3
t1 = cv.getTickCount()      #getTickCount获取CPU所有时间的总数
access_pixels(src)          #调用
t2 = cv.getTickCount()      #getTickCount获取CPU所有时间的总数
time = ((t2-t1)/cv.getTickFrequency())#t2-t1除以每一秒钟的数量,得到总的秒数
print("time : %s ms" % (time*1000))   #总的秒数*1000得毫秒数,并打印输出

图5.3代码

6、如何自己创建一个新的图像?

(1)创建多通道的图像

Python_08OpenCV图像处理_第9张图片

图6.1
def create_image():
    """"
    多通道
    一般就是RGB图像
    """
    img = np.zeros([400,400,3],np.uint8)    #创建一个三通道的高和宽都是4003通道,类型是np.uint8(八位的)
    #img[:, :, 0] = np.ones([400, 400] * 255)     #修改第0个通道的值;ones跟大小一样相当于都是0,相当于是第0个通道了蓝色;
    #img[:, :, 1] = np.ones([400, 400] * 255)     # 如果是1就是绿色;前面必须默认是整个的
    img[:, :, 2] = np.ones([400, 400] * 255)     # 如果是2就是红色;
    cv.imshow("new.image",img)                   #显示出来

图6.1代码

(2)创建单通道的图像

Python_08OpenCV图像处理_第10张图片

图6.2
def create_image():
	"""
    单通道
    最常见的单通道就是灰度图像
    """
    img = np.zeros([400,400,1],np.uint8)           #zeros初始化为0;同样是8位
    img[:,:,0] = np.ones([400,40])*127             #ones初始化为1;127就是灰度的
    """
    3637行代码可写成4142行代码
    """
    img = np.ones([400, 400, 1], np.uint8)          #ones初始化为1,单通道
    img =img *255                                   #乘255是白色
    cv.imshow("new.image", img)
图6.2代码

7、类型转换,维度转换

(1)类型转换

cv.convertScaleAbs()

计算完后将结果浮点数变成八位的整型,绝对值变成正的

(2)维度转换

m1 = np.ones([3,3],np.float32)#注意选择合适类型
m1.fill(122,388)
print(m1)
m2 = m1.reshape([1,9])#19print(m2)
#以上是三维转二维

(3)数组fill()方法

m3 = np.array([[2,3,4][4,5,6],[7,8,9]],np.int32)
m3.fill(9)
print(m3)
输出结果本是
	[[2,3,4]
     [4,5,6]
     [7,8,9]]

加上m3.fill(9)后输出结果是
    [[9,9,9]
     [9,9,9]
     [9,9,9]]

你可能感兴趣的:(笔记)