赞
踩
本篇文章主要讲了 Opencv介绍、发展历程、图像的基本操作、像素基本操作、NumPy处理像素。后续内容还会继续再更,有需要的伙伴可以支持一下,哈哈哈,本人也只是一个小小白!没太多华丽的辞藻,纯干货,纯入门完全可以看看。
Python是当下热门的一种编程语言,语法简洁、功能强大。OpenCV是一个开源的计算机视觉库,
能够让开发人员更专注处理图像本身,而非处理图像时的具体实现算法。也就是说,OpenCV让结
构复杂的计算机视觉应用变得非常容易。因此,OpenCV被广泛地应用于各个领域。本章将从Pyth
on出发,途经OpenCV,走进Python OpenCV。
OpenCV的目标是提供一系列易用、高效和可扩展的图像处理和计算机视觉算法,以满足广泛的应用需求。它涵盖了从基本的图像处理任务(如滤波、边缘检测、颜色空间转换)到复杂的计算机视觉算法(如目标检测、特征提取、三维重建)的各个方面。
OpenCV的主要特点包括:
OpenCV的发展历程:
OpenCV 在过去的几年中迅速发展,并成为计算机视觉领域最受欢迎的库之一。它广泛应用于图像处理、目标检测与跟踪、人脸识别、机器学习和深度学习等领域。
基本操作我大致理解为四步:读显保获
即读取数据
import cv2 #导入opencv库
image = cv2.imread("photo.jpg") #同路径下
结果展示:
这个结果表示 :它是一个3D数组,每个子数组代表一行像素,每个元素表示一个像素点的RGB(红绿蓝)值。RGB是一种表示颜色的方式,其中红、绿、蓝三种基本颜色的不同强度组合在一起形成了各种颜色。
例如,对于第一个子数组[[254 254 254] [254 254 254] [254 254 254] … [254 254 254] [254 254 254] [254 254 254]] ,它表示了一行像素,每个像素的RGB值分别为(254,254,254),(254,254,254),(254,254,254), … , (254,254,254),(254,254,254),(254,254,254).
即显示图片
import cv2 #导入opencv库
image = cv2.imread("photo.jpg") #同路径下
cv2.imshow("Ping",image) #显示图片
cv2.waitKey() #按下任何键盘按键后
cv2.destroyAllWindows() #销毁所有窗口
结果展示:
即保存图片
import cv2
image = cv2.imread("photo.jpg")
cv2.imwrite("C:/Users/ping/Desktop/photo.jpg",image) #保存路径
结果展示:
即获取数据
import cv2
image_color = cv2.imread("photo.jpg")
print("shape = ",image_color.shape) # 图像的形状
print("size = ",image_color.size) # 图像的大小
print("dtype = ",image_color.dtype) # 图像的类型
说明:
shape = (266,474,3) 表示该彩色图像具有266行、474列和3个颜色通道(红、绿、蓝)
size = 378252 将图像的行数与列数相乘得到的,像素的总数
dtype = uint8 图像数据的类型,uint8是一种无符号8位整数类型,范围为(0-255)
cv2.imshow(winname, mat)
winname:窗口名称 mat:要显示的图像
cv.imread(filename, flags)
filename:文件路径
flags:可选值:
①:cv2.IMREAD_COLOR:默认值,彩色模式,可用数字1代替
②:cv2.IMREAD_GRAYSCALE:灰度模式,可用数字0代替
③:cv2.IMREAD_UNCHANGED:alpha 通道模式,可用数字-1代替
cv.waitKey(delay)
delay:等待用户按键的时间(以毫秒为单位)。如果指定为 0,则表示无限期等待,直到用户按下键为止。
函数返回一个整数值,而我们可以利用这个返回值做条件判断:
如:key = cv2.waitKey(0) # 等待按键
if key == ord(‘w’): # 按下"W"键
cv2.destroyAllWindows() # 关闭窗口
cv2.destroyAllWindows()
关闭所有已打开的图像窗口。该函数没有任何参数,它会遍历当前程序中的所有图像窗口,并将它们全部关闭。
像素是图像的最小单位。每一幅图像都是由M行N列的像素组成的,其中每一个像素都存储一个像素值。以灰度图像为例,计算机通常把灰度图像的像素处理为256个灰度级别,256个灰度级别分别使用区间[0, 255]中的整数数值表示。其中,“0”表示纯黑色;“255”表示纯白色。
import cv2
image = cv2.imread("photo.jpg")
px = image[10,10] # 获取坐标为(10, 10)上的像素
print(px)
结果展示:
import cv2
image = cv2.imread("photo.jpg")
cv2.imshow("Ping",image)
for i in range(10,100):
for j in range(10,100):
image[i,j] = [255,255,255]
cv2.inshow("Ping",image)
cv2.waitKey()
cv2.destroyAllWindows()
结果展示:
创建图像是图像识别的第一步,没有图什么都做不了
import cv2
import numpy as np
img = np.ones((200,200),np.uint8) # 把ones换成zeros即变黑
cv2.imshow("Ping",img)
cv2.waitKey()
cv2.destroyAllWindows()
例1:
在图片上添加色块:
import cv2
import numpy as np
img = cv2.imread("C:/Users/ping/Desktop/photo.jpg")
img[25:75][50:100] = 255 # 再上一块区域
cv2.imshow("Ping",img)
cv2.waitKey()
cv2.destroyAllWindows()
结果展示:
例2:
黑白相间
import cv2
import numpy as np
img = np.zeros((500,500))
for i in range(10,450,50):
img[0:500,i+30:i+60]=1 # 高 ,长
cv2.imshow("Ping",img)
cv2.waitKey()
cv2.destroyAllWindows()
结果展示:
例3:
纯色图块
import cv2
import numpy as np
img = np.zeros((300,300,3))
blue = img.copy()
blue[:,:,0] = 255 # 1通道所有像素都为255
green= img.copy()
green[:,:,1] = 255 # 2通道所有像素都为255
red= img.copy()
red[:,:,2] = 255 # 3通道所有像素都为255
cv2.imshow("Blue",blue)
cv2.imshow("Green",green)
cv2.imshow("Red",red)
cv2.waitKey()
cv2.destroyAllWindows()
结果展示:
例4
随机彩色图像
import cv2
import numpy as np
img = cv2.random.randint(0,256,size=(200,200,3),dtype=np.uint8)
cv2.imshow("Piny",img)
cv2.waitKey()
cv2.destroyAllWindows()
两张图片上下,左右拼接
import cv2
import numpy as np
img1 = cv2.imread("C:/Users/ping/Desktop/photo.jpg")
img2 = cv2.imread("C:/Users/ping/Desktop/photo.jpg")
img_h = np.hstack((img1,img2))
img_v = np.vstack((img1,img2))
cv2.imshow("Ping,img_h")
cv2.imshow("Ping,img_v")
cv2.waitKey()
cv2.destroyAllWindows()
效果展示:
NumPy(Numerical Python)是一个用于处理数值计算的Python库。它提供了一个高性能的多维数组对象(ndarray)以及用于处理这些数组的各种函数和工具。
NumPy的主要功能包括:
当初,面对这个问题我也一直存在疑惑,为啥不直接import numpy,而是还要 import numpy as np ,同样都是要导入numpy库。如此操作,不是还多此一举了嘛。随着后面慢慢的了解,才知道,这种做法是为了方便在代码中使用NumPy的函数和工具。通过给NumPy库指定一个短的别名,我们可以更加简洁地调用NumPy的功能,减少了代码的冗余,并且提高了代码的可读性。
使用np.array()函数创建一个一维或多维数组。
使用np.zeros()创建一个全零数组。
使用np.ones()创建一个全一数组。
使用np.arange()创建一个指定范围的数组。
使用np.random.rand()创建一个指定形状的随机数组
import numpy as np n1 = np.array([1,2,3]) # 创建一维数组 n2 = np.array([0.1,0.2,0.3]) print(n1) # 输出:[1 2 3] print(n2) # 输出:[0.1 0.2 0.3] n3 = np.array([1,2],[3,4]) # 创建二维数组 print(n3) # [[1 2 3][4 5 6]] n4 = np.array([1,2,3,4,5],dtype = float) # 创建指定数据类型的数组 print(n4) # [1. 2. 3. 4. 5.] n5 = np.array(range(1,6)) # 创建指定范围内的数字组成的数组 print(n5) # [1 2 3 4 5] n6 = np.zeros((100,100),np.uint8) # 创建一个100*100的全零数组 n7 = np.ones((100,100),np.uint8) # 创建一个100*100的全一数组 n8 = np.random.randint(1,3,10) # 生成十个1-2之间的数 print(n8) # [2 1 1 2 2 2 1 1 2 2] n9 = np.random.randint(5,size=(2,5)) # 5以内数,填充到2行5列的二维数组中 print(n9) # [[4 0 4 2 1] [0 0 4 0 2]]
import numpy as np
n1 = np.array([1, 2]) # 创建一维数组
n2 = np.array([3, 4]) # 创建一维数组
print(n1 + n2) # 加法运算
print(n1 - n2) # 减法运算
print(n1 * n2) # 乘法运算
print(n1 / n2) # 除法运算
print(n1 ** n2) # 幂运算
import numpy as np
n1 = np.array([1,2])
n2 = np.array([3,4])
print(n1 >= n2)
print(n1 == n2)
print(n1 <= n2)
print(n1 != n2)
结果展示:
跟python中的索引切片大差不差
import numpy as np n = np.array([0,1,2,3,4,5,6,7,8,9]) print(n) print(n[:3]) # 1 2 print(n[3:6]) # 3 4 5 print(n[6:]) # 6 7 8 9 print(n[::]) # 0 1 2 3 4 5 6 7 8 9 print(n[:]) # 1 2 3 4 5 6 7 8 9 print(n[::2]) # 0 2 4 6 8 print(n[1::5]) # 1 6 print(n[2::6]) # 2 8 #start、stop、step为负数时 print(n[::-1]) # 9 8 7 6 5 4 3 2 1 0 print(n[:-3:-1]) # 9 8 print(n[-3:-5:-1]) # 7 6 print(n[-5::-1]) # 5 4 3 2 1 0
结果展示:
import numpy as np
# 创建3行4列的二维数组
n = np.array([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]])
print(n[1]) # 获取第二个元素的内容
print(n[1, 2]) # 获取第二元素的第三个值
print(n[-1]) # 获取最后一个元素的内容
结果展示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。