1.读取一个像素点的BGR属性
import cv2
image = cv2.imread("1.1.jpg") # 读取1.1.jpg
# 把1.1.jpg保存为E盘根目录下的、Pictures文件夹中的1.jpg
cv2.imwrite("1.jpg", image)
2.修改区域像素点的BGR
import cv2
image = cv2.imread("2.1.jpg")
cv2.imshow("2.1", image) # 显示图2.1
for i in range(241, 292): # i表示横坐标,在区间[241, 291]内取值
for j in range(168, 219): # j表示纵坐标,在区间[168, 218]内取值
image[i, j] = [255, 255, 255] # 把区域内的所有像素都修改为白色
cv2.imshow("2.8", image) # 显示图2.8
cv2.waitKey()
cv2.destroyAllWindows() # 关闭所有的窗口时,销毁所有窗口
3.RGB(彩色)转GRAY(灰色)
import cv2
image = cv2.imread("2.1.jpg")
cv2.imshow("2.1",image)
# 将图2.1从RGB色彩空间转换到GRAY色彩空间
gray_image = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
cv2.imshow("GRAY",gray_image) # 显示灰度图像
cv2.waitKey()
cv2.destroyAllWindows()
"""
知识点:
1.opencv读取图像的色彩是按照从 B G R 顺序来的
2.GRAY是灰度图像,灰度图像是一种每个像素都是从黑到白,被处理为256个灰度级别的但是通道
这256个灰度级别分别用区间[0,255]中的数值表示。其中,"0" 表示纯黑色,"255" 表示纯白色
0~255之间的数值表示不同亮度(既色彩的深浅程度) 的深灰色或者浅灰色
"""
4.RGB色彩空间转换到HSV色彩空间
import cv2
image = cv2.imread("2.1.jpg")
cv2.imshow("2.1",image)
# 将图2.1从RGB色彩空间转换到GRAY色彩空间
gray_image = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
cv2.imshow("GRAY",gray_image) # 显示灰度图像
cv2.waitKey()
cv2.destroyAllWindows()
"""
知识点:
1.opencv读取图像的色彩是按照从 B G R 顺序来的
2.GRAY是灰度图像,灰度推向是一种每个像素都是从黑到白,被处理为256个灰度级别的但是通道
这256个灰度级别分别用区间[0,255]中的数值表示。其中,"0" 表示纯黑色,"255" 表示纯白色
0~255之间的数值表示不同亮度(既色彩的深浅程度) 的深灰色或者浅灰色
"""
5.拆分BGR通道图像
import cv2
rgb_image = cv2.imread("2.1.jpg")
cv2.imshow("2.1", rgb_image) # 显示图2.1
b, g, r = cv2.split(rgb_image) # 拆分图2.1中的通道
cv2.imshow("B", b) # 显示图2.1中的B通道图像
cv2.imshow("G", g) # 显示图2.1中的G通道图像
cv2.imshow("R", r) # 显示图2.1中的R通道图像
cv2.waitKey()
cv2.destroyAllWindows()
6.拆分HSV图像中的通道
import cv2
rgb_image = cv2.imread("2.1.jpg")
cv2.imshow("2.1", rgb_image) # 显示图2.1
# 图2.1从RGB色彩空间转换到HSV色彩空间
hsv_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2HSV)
h, s, v = cv2.split(hsv_image) # 拆分HSV图像中的通道
cv2.imshow("H", h) # 显示HSV图像中的H通道图像
cv2.imshow("S", s) # 显示HSV图像中的S通道图像
cv2.imshow("V", v) # 显示HSV图像中的V通道图像
cv2.waitKey()
cv2.destroyAllWindows()
7.RGB的顺序合并通道
import cv2
rgb_image = cv2.imread("2.1.jpg")
b, g, r = cv2.split(rgb_image) # 拆分图2.1中的通道
bgr = cv2.merge([b, g, r]) # 按B→G→R的顺序合并通道
cv2.imshow("BGR", bgr)
rgb = cv2.merge([r, g, b]) # 按R→G→B的顺序合并通道
cv2.imshow("RGB", rgb)
rgb = cv2.merge([g, r, b]) # 按G→R→B的顺序合并通道
cv2.imshow("GRB", rgb)
cv2.waitKey()
cv2.destroyAllWindows()
8.HSV合并通道
import cv2
rgb_image = cv2.imread("2.1.jpg")
# 图2.1从RGB色彩空间转换到HSV色彩空间
hsv_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2HSV)
h, s, v = cv2.split(hsv_image) # 拆分HSV图像中的通道
hsv = cv2.merge([h, s, v]) # 合并拆分后的通道图像
cv2.imshow("HSV", hsv) # 显示合并通道的HSV图像
cv2.waitKey()
cv2.destroyAllWindows()
9.将HSV中H通道的值调整180
import cv2
rgb_image = cv2.imread("2.1.jpg")
cv2.imshow("2.1", rgb_image)
# 图2.1从RGB色彩空间转换到HSV色彩空间
hsv_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2HSV)
h, s, v = cv2.split(hsv_image) # 拆分HSV图像中的通道
h[:, :] = 180 # 将H通道的值调整为180
hsv = cv2.merge([h, s, v]) # 合并拆分后的通道图像
# 合并通道后的图像从HSV色彩空间转换到RGB色彩空间
new_Image = cv2.cvtColor(hsv, cv2.COLOR_HSV2RGB)
cv2.imshow("NEW", new_Image)
cv2.waitKey()
cv2.destroyAllWindows()
"""
知识点:适当的调整各个通道的值 可以让图片达到艺术效果
"""
10.将RGBA图像的透明度调整为172
import cv2
rgb_image = cv2.imread("2.1.jpg")
# 图2.1从RGB色彩空间转换到RGBA色彩空间
rgba_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2RGBA)
cv2.imshow("RGBA", rgb_image) # 显示RGBA图像
r, g, b, a = cv2.split(rgba_image) # 拆分RGBA图像中的通道
a[:, :] = 172 # 将RGBA图像的透明度调整为172(半透明)
rgba_172 = cv2.merge([r, g, b, a]) # 合并拆分后并将透明度调整为172的通道图像
a[:, :] = 0 # 将RGBA图像的透明度调整为0(透明)
rgba_0 = cv2.merge([r, g, b, a]) # 合并拆分后并将透明度调整为0的通道图像
cv2.imshow("A = 172", rgba_172) # 显示透明度为172的RGBA图像
cv2.imshow("A = 0", rgba_0) # 显示透明度为0的RGBA图像
cv2.waitKey()
cv2.destroyAllWindows()
cv2.imwrite("RGBA_image.png",rgba_image)
cv2.imwrite("RGBA_image_172.png",rgba_172)
cv2.imwrite("RGBA_image_0.png",rgba_0)
11.numpy数组创建
import numpy as np
n1 = np.array([1, 2, 3]) # 创建一个简单的一维数组
n2 = np.array([0.1, 0.2, 0.3]) # 创建一个包含小数的一维数组
n3 = np.array([[1, 2], [3, 4]]) # 创建一个简单的二维数组
12.numpy创建浮点型数组
import numpy as np # 导入numpy模块
list = [1, 2, 3] # 列表
# 创建浮点型数组
n1 = np.array(list, dtype=np.float_)
# 或者
n1 = np.array(list, dtype=float)
print(n1) # [1. 2. 3.]
print(n1.dtype) # float64
print(type(n1[0])) # <class 'numpy.float64'>
13.numpy创建三维数组
import numpy as np
nd1 = [1, 2, 3]
nd2 = np.array(nd1, ndmin=3) #三维数组
print(nd2)
14.创建2行3列的未初始化数组
import numpy as np
n = np.empty([2, 3]) # 创建两行三列的未初始化数组
print(n) # [[0.00000000e+000 0.00000000e+000 2.78145267e-307][4.00537061e-307 9.45708167e-308 0.00000000e+000]]
15.创建纯0数组
import numpy as np
n = np.zeros((3, 3), np.uint8) # 创建纯0数组
print(n)
"""
创建用0填充的数组需要使用zeros()方法,该方法创建的元素为0,
Opencv经常使用该方法创建纯黑图像
"""
16.创建纯1数组
import numpy as np
n = np.ones((3, 3), np.uint8) # 创建三行三列的,数字类型为无符号8位整数的纯1数组
print(n)
"""
创建用1填充的数组需要使用ones()方法,该方法创建的数组元素均为1。
Opencv经常使用该方法创建掩模,卷积核等用于计算的二维数组
"""
17.numpy生成范围随机数组
import numpy as np
n1 = np.random.randint(1, 3, 10)
print('随机生成10个1到3之间且不包括3的整数:')
print(n1)
n2 = np.random.randint(5, 10)
print('size数组大小为空随机返回一个整数:')
print(n2)
n3 = np.random.randint(5, size=(2, 5))
print('随机生成5以内二维数组')
print(n3)
18.numpy对数组做加法运算
import numpy as np
n1 = np.array([1, 2]) # 创建一维数组
n2 = np.array([3, 4])
print(n1 + n2) # 加法运算
19.numpy对数组做减法,乘法和除法运算
import numpy as np
n1 = np.array([1, 2]) # 创建一维数组
n2 = np.array([3, 4])
print(n1 - n2) # 减法运算
print(n1 * n2) # 乘法运算
print(n1 / n2) # 除法运算
20.numpy对数组进行幂运算
import numpy as np
n1 = np.array([1, 2]) # 创建一维数组
n2 = np.array([3, 4])
print(n1 ** n2) # 幂运算
21.numpy使用逻辑运算符比较数组
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) # 不等于
22.numpy复制数组
import numpy as np
n1 = np.array([1, 2]) # 创建一维数组
n2 = n1.copy() # 创建复制第一个数组
print(n1 == n2) # 比较两个数组是否相等
n2[0] = 9 #副本数组修改第一个元素
print(n1)
print(n2)
print(n1 == n2) # 比较两个数组是否相等
23.查找一维数组索引为0的元素
import numpy as np
n1 = np.array([1, 2, 3]) # 创建一维数组
print(n1[0])
24.numpy数组的索引和切片
import numpy as np
n1=np.array([1,2,3]) #创建一维数组
print(n1[0])
print(n1[:3])
print(n1[0:2])
print(n1[1:])
print(n1[:2])
"""
什么是切片?
数组的切片可以理解为对数组的分割,按照等分或许不等分,将一个数组切割为多个片段,与
python列表中的切片操作一样,numpy中的切片用冒号分割切片参数来进行切换操作,
语法如下:
[start:stop:step]
参数说明:
start: 起始索引,若是不写任何值,则表示从0开始的全部索引。
stop : 终止索引,若不写任何值,则表示直到末尾的全部索引
step : 步长。
"""
25.numpy使用不同的切片式索引操作获取数组中的元素
import numpy as np
n = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(n) # [0 1 2 3 4 5 6 7 8 9]
print(n[:3]) # [0 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[:]) # [0 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]
26.二维数组索引
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])
"""
上面代码中,n[1]表示第二个数组,n[1,2]表示第2个数组第三个元素,它等同于n[1][2],
表示数组n中第三行第3列的值,实际上n[1][2]是索引第一个维度得到的一个数组,然后在此基础上再索引
二维数组索引可以使用array[n,m]的方式,以逗号分隔,表示第n个数组的第m个元素。
"""
27.对二维数组进行切片式索引操作
import numpy as np
# 创建3行3列的二维数组
n = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(n[:2, 1:]) # 取前两个数组,取每个数组的第1个后面的元素
print("----")
print(n[1, :2]) # 取二维数组中的元素为1的数组,取当前数组的的前两个
print("----")
print(n[:,:1]) # :取所有的二维数组前1个元素
28.创建纯黑色图像
import cv2
import numpy as np
width = 200 # 图像的宽
height = 100 # 图像的高
# 创建指定宽高、单通道、像素值都为0的图像
img = np.zeros((height,width),np.uint8)
cv2.imshow("img",img)# 展示图像
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
29.创建纯白色图像
import cv2
import numpy as np
width = 200 # 图像的宽
height = 100 # 图像的高
# 创建指定宽高、单通道、像素值都为1的图像
img = np.ones((height, width), np.uint8) * 255
cv2.imshow("img", img) # 展示图像
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
"""
创建纯白图像有两种方式,第一种先是纯黑图像,然后将图像中所有的像素值改为255,
第二种使用Numpy提供的ones()方法
创建一个像素值均为1的数组,然后让数组乘以255,同样可以得到一种纯白色的图像
"""
30.在黑色图像内部绘制白色矩形
import cv2
import numpy as np
width = 200 # 图像的宽
height = 100 # 图像的高
# 创建指定宽高、单通道、像素值都为0的图像
img = np.zeros((height, width), np.uint8)
# 图像纵坐标25到75像素、横坐标50到100像素 之间的区域变为白色
img[25:75,50:100] = 255
cv2.imshow("img",img) # 展示图像
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
"""
思路总结:
先绘制纯黑色图像作为背景,然后使用切片式索引操作将图像中横坐标为50-100,
纵坐标为25-75的矩形区域颜色改为纯白色
"""
31.创建黑白相间的图像
import cv2
import numpy as np
width = 200 # 图像的宽
height = 100 # 图像的高
# 创建指定宽高、单通道、像素值为0的图像
img = np.zeros((height, width), np.uint8)
for i in range(0, width, 40):
img[:, i:i + 20] = 255 # 白色区域的宽度为20像素
cv2.imshow("img",img) # 展示图像
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
"""
range()函数用法
range(start, stop[, step])
start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
"""
32.创建彩色图像
import cv2
import numpy as np
width = 200 # 图像的宽
height = 100 # 图像的高
# 创建指定宽高、3通道、像素值都为0的图像
img = np.zeros((height, width, 3), np.uint8)
blue = img.copy() # 复制图像
blue[:, :, 0] = 255 # 1通道所有像素都为255
print(blue)
green = img.copy()
green[:, :, 1] = 255 # 2通道所有像素都为255
print(green)
red = img.copy()
red[:, :, 2] = 255 # 3通道所有像素都为255
print(red)
cv2.imshow("blue", blue) # 展示图像
cv2.imshow("green", green)
cv2.imshow("red", red)
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
33.创建随机像素的雪花点图像
import cv2
import numpy as np
width = 200 # 图像的宽
height = 100 # 图像的高
# 创建指定宽高、单通道、随机像素值的图像、随机值在0~256之间,数字为无符号8位格式 二维的
img = np.random.randint(256, size=(height, width), dtype=np.uint8)
cv2.imshow("img_2", img) # 展示图像
img = np.random.randint(256, size=(height, width,3), dtype=np.uint8)
cv2.imshow("img_3", img) # 展示图像
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
34.按照水平和垂直两种方式拼接两张图像
import cv2
import numpy as np
img = cv2.imread("stone.jpg") # 读取原始图像
img_h = np.hstack((img,img)) # 水平拼接两个图像
img_v = np.vstack((img,img)) # 垂直拼接两个图像
cv2.imshow("img_h", img_h) # 展示拼接之后的效果
cv2.imshow("img_v", img_v)
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
思维导图