opencv_02_图像数字化基础

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()  # 释放所有窗体

思维导图

image

posted @ 2021-09-07 21:54  秋吉  阅读(70)  评论(0编辑  收藏  举报