• 图像数字化基础


    一、像素
    1、获取图像指定位置的像素
    1. import cv2
    2. image = cv2.imread("E:\\images\\2.png")
    3. px = image[291,218]
    4. print("坐标(291,218)上的像素的BGR值是:",px)
    (1)RGB色彩空间
    • R通道:红色通道

    • G通道:绿色通道

    • B通道:蓝色通道

    (2)RGB的表示

    通常使用一个三维数组来表示一幅图像中某一个像素的RGB值

    (3)RGB图像

    RGB图像时指用RGB色彩空间显示的图像,BGR图像是指使用BGR色彩空间显示的图像;RGB色彩空间和

    BGR色彩空间的区别是图像在RGB色彩空间中的通道顺序是R->G->B,在BGR的色彩空间中的通道顺序是

    B->G-R

    2、修改像素的BGR值

    对于RGB/BGR图像,当每个像素的R、G、B这3个值相等时,就可以得到灰度图像。其中。

    R=G=B=0(B=G=R=0)为纯黑色;R=G=B=255(B=G=R=255)为纯白色

    1. import cv2
    2. image = cv2.imread("E:/images/2.png")
    3. cv2.imshow("2",image)
    4. for i in range(241,292):
    5. for j in range(168,219):
    6. image[i,j] = [255,255,255]
    7. cv2.imshow("3",image)
    8. cv2.waitKey()
    9. cv2.destroyWindow()
    二、色彩空间
    1、GRAY色彩空间
    • GRAY色彩空间通常指的是灰度图像,灰度图像是一种每个像素都是从黑到白,被处理为256个灰度级别的单

    色图像。这256个灰度级别分别用区间[0,255]中的数值表示。其中“0”表示纯黑色,“255”表示纯白色,0~255之间

    的数值表示不同的亮度(即色彩的深浅程度)的深灰色或浅灰色。因此,一幅灰度图像能够展示丰富的细节信息。

    • 从RGB/BGR色彩空间转换到GRAY色彩空间

    1. dst = cv2.cvtColor(src,code)
    2. dst:转换后的图像
    3. src:转换前的初始图像
    4. code:色彩空间转换码
    色彩空间转换码含义
    cv2.COLOR_BGR2GRAY从BGR色彩空间转换到GRAY色彩空间
    cv2.COLOR_RGB2GRAY从RGB色彩空间转换到GRAY色彩空间
    1. import cv2
    2. image = cv2.imread("E:/images/2.png")
    3. cv2.imshow("2.1",image)
    4. #将图像2.png从BGR色彩空间转换到GRAY色彩空间
    5. gray_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    6. cv2.imshow("GRAY",gray_image)
    7. cv2.waitKey()
    8. cv2.destroyWindow()
    2、HSV色彩空间
    • HSV色彩空间是基于色调、饱和度和亮度而言的。其中,色调(H)是指光的颜色。在OpenCV中,色调在区间【0,180】内取值。例如,代表红色、黄色、绿色和蓝色的色调值分别为0、30、60和120

    • 从RGB/BGR色彩空间转换到HSV色彩空间

    色彩空间转换码含义
    cv2.COLOR_BGR2HSV从BGR色彩空间转换到HSV色彩空间
    cv2.COLOR_RGB2HSV从RGB色彩空间转换到HSV色彩空间
    1. import cv2
    2. image = cv2.imread("E:/images/2.png")
    3. cv2.imshow("2.1",image)
    4. #将图像2.png从BGR色彩空间转换到GRAY色彩空间
    5. hsv_image = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
    6. cv2.imshow("HSV",hsv_image)
    7. cv2.waitKey()
    8. cv2.destroyWindow()
    三、通道
    1、拆分通道
    • 拆分一幅BGR图像中的通道
    1. b,g,r = cv2.split(bgr_image)
    2. 参数说明:
    3. b:B通道图像
    4. g:G通道图像
    5. r: R通道图像
    6. bgr_image:一幅BGR图像
    1. import cv2
    2. bgr_image = cv2.imread("E:/images/2.png")
    3. cv2.imshow("2.1",bgr_image)
    4. b,g,r = cv2.split(bgr_image)
    5. cv2.imshow("B",b)
    6. cv2.imshow("G",g)
    7. cv2.imshow("R",r)
    8. cv2.waitKey()
    9. cv2.destroyWindow()
    • 拆分一幅HSV图像中的通道
    1. h,s,v = cv2.split(hsv_image)
    2. 参数说明:
    3. h:H通道图像
    4. s:S通道图像
    5. v:V通道图像
    6. hsv_image:一幅HSV图像
    1. import cv2
    2. bgr_image = cv2.imread("E:/images/avatar.png")
    3. cv2.imshow("2.1",bgr_image)
    4. #把图2.1从BGR色彩空间转换到HSV色彩空间
    5. hsv_image = cv2.cvtColor(bgr_image,cv2.COLOR_BGR2HSV)
    6. h,s,v = cv2.split(hsv_image)
    7. cv2.imshow("H",h)
    8. cv2.imshow("S",s)
    9. cv2.imshow("V",v)
    10. cv2.waitKey()
    11. cv2.destroyWindow()
    2、合并通道

    合并通道是拆分通道的逆操作

    • 合并B、G、R通道图像

    1. bgr = cv2.merge([b,g,r])
    2. 参数说明:
    3. bgr:按B->G->R的顺序合并通道后得到的图像
    4. r:R通道图像
    5. g:G通道图像
    6. b:B通道图像
    7. 注意:合并通道的顺序不同,图像的显示效果也不同
    1. import cv2
    2. bgr_image = cv2.imread("E:/images/avatar.png")
    3. cv2.imshow("2.1",bgr_image)
    4. b,g,r = cv2.split(bgr_image) #拆分图2.1中的通道
    5. bgr = cv2.merge([b,g,r]) #按B->G->R的顺序合并通道
    6. cv2.imshow("BGR",bgr)
    7. rgb = cv2.merge([r,g,b]) #按R->G->B的顺序合并通道
    8. cv2.imshow("RGB",rgb)
    9. cv2.waitKey()
    10. cv2.destroyWindow()
    • 合并H、S、V通道图像
    1. hsv = cv2.merge([h,s,v])
    2. 参数说明:
    3. hsv:合并H通道图像、S通道图像和V通道图像后得到的图像
    4. h:H通道图像
    5. s:S通道图像
    6. v:V通道图像
    1. import cv2
    2. bgr_image = cv2.imread("E:/images/avatar.png")
    3. cv2.imshow("avatar.png",bgr_image)
    4. #把图像avatar.png从RGB色彩空间转换到HSV色彩空间
    5. hsv_image = cv2.cvtColor(bgr_image,cv2.COLOR_BGR2HSV)
    6. h,s,v = cv2.split(hsv_image) #拆分HSV图像中的通道
    7. hsv = cv2.merge([h,s,v]) #合并拆分后的通道图像
    8. cv2.imshow("HSV",hsv) #显示合并通道的HSV图像
    9. cv2.waitKey()
    10. cv2.destroyWindow()
    3、alpha通道

    BGR色彩空间包含3个通道,即B通道、G通道、R通道。OpenCV在这3个通道的基础上增加了一个A通道,即alpha通道,用于设置图像的透明度。alpha通道在区间【0,255】内取值;其中,0表示透明,255表示不透明

    1. import cv2
    2. bgr_image = cv2.imread("E:/images/avatar.png")
    3. cv2.imshow("2.1",bgr_image)
    4. #把图像2.1从BGR色彩空间转换到BGRA色彩空间
    5. bgra_image = cv2.cvtColor(bgr_image,cv2.COLOR_BGR2BGRA)
    6. cv2.imshow("BGRA",bgra_image) #显示BGRA图像
    7. r,g,b,a = cv2.split(bgra_image)
    8. a[:,:] = 172
    9. bgra_172 = cv2.merge([r,g,b,a])
    10. a[:,:] = 0
    11. bgra_0 = cv2.merge([r,g,b,a])
    12. cv2.imshow("A = 172",bgra_172)
    13. cv2.imshow("A = 0",bgra_0)
    14. cv2.waitKey()
    15. cv2.destroyWindow()
    四、使用NumPy模块操作像素
    1、NumPy概述

    NumPy提供了一个高性能的数组对象,可以轻松创建一维数组、二维数组和多维数组等大量实用方法,帮助开发者轻松地进行数组计算。从而广泛的应用于数据分析、机器学习、图像处理和计算机图形学、数学任务等领域中

    2、创建数组
    1. numpy.array(object,dtype,copy,order,subok,ndmin)
    2. 参数说明:
    3. object:任何具有数组接口方法的对象
    4. dtype:数据类型
    5. copy:可选参数,布尔型,默认值为True,则object对象被复制
    6. order:元素在内存中的出现顺序
    7. subok:布尔型。如果值为True,则将传递子类
    8. ndmin:指定生成数组的最小维数
    • 创建一维和二维数组
    1. import numpy as np
    2. n1 = np.array([1,2,3]) #创建一个简单的一维数组
    3. n2 = np.array([0.1,0.2,0.3]) #创建一个包含小数的一维数组
    4. n3 = np.array([[1,2],[3,4]]) #创建一个简单的二维数组
    • 创建浮点型数组
    1. import numpy as np
    2. list = [1,2,3]
    3. #创建浮点型数组
    4. n1 = np.array(list,dtype=np.float_)
    5. print(n1)
    6. print(n1.dtype)
    7. print(type(n1[0]))
    • 创建三维数组
    1. import numpy as np
    2. list = [1,2,3]
    3. nd1 = np.array(list,ndmin=3)
    4. print(nd1)
    3、操作数组
    • 数组加、减、乘、除
    1. import numpy as np
    2. n1 = np.array([1,2])
    3. n2 = np.array([3,4])
    4. print(n1 + n2)
    5. print(n1 - n2)
    6. print(n1 * n2)
    7. print(n1 / n2)
    8. //输出
    9. [4 6]
    10. [-2 -2]
    11. [3 8]
    12. [0.33333333 0.5 ]
    • 幂运算
    1. import numpy as np
    2. n1 = np.array([1,2])
    3. n2 = np.array([3,4])
    4. print(n1 ** n2)
    5. //输出:[ 1 16]
    • 比较运算
    1. import numpy as np
    2. n1 = np.array([1,2])
    3. n2 = np.array([3,4])
    4. print(n1 >= n2)
    5. print(n1 == n2)
    6. print(n1 <= n2)
    7. print(n1 != n2)
    8. //输出
    9. [False False]
    10. [False False]
    11. [ True True]
    12. [ True True]
    • 复制数组
    1. import numpy as np
    2. n1 = np.array([1,2])
    3. n2 = n1.copy()
    4. print(n1 == n2)
    5. n2[0] = 9
    6. print(n1)
    7. print(n2)
    8. print(n1 == n2)
    9. //输出
    10. [ True True]
    11. [1 2]
    12. [9 2]
    13. [False True]
    • 索引和切片
    1. import numpy as np
    2. n1 = np.array([1,2,3])
    3. print(n1[0])
    4. print(n1[1])
    5. print(n1[0:2])
    6. print(n1[1:])
    7. print(n1[:2])
    8. //输出
    9. 1
    10. 2
    11. [1 2]
    12. [2 3]
    13. [1 2]
    4、创建图像

    在OpenCV中,黑白图像实际是一个二维数组,彩色图像是一个三维数组。数组中每个元素就是图像对应位置的像素值。因此修改图像像素的操作实际就是修改数组的操作

    1. 注意:数组索引、像素行列、像素坐标的关系如下
    2. 数组行索引 = 像素所在行数 - 1 = 像素纵坐标
    3. 数组列索引 = 像素所在列数 - 1 = 像素横坐标
    • 创建纯黑色图像
    1. import cv2
    2. import numpy as np
    3. width = 200
    4. height = 100
    5. #创建指定宽度、高度、像素值都为0的图像
    6. img = np.zeros((height,width),np.uint8) #用0填充数组
    7. cv2.imshow("img",img)
    8. cv2.waitKey()
    9. cv2.destroyWindow()
    • 创建纯白色图像
    1. import cv2
    2. import numpy as np
    3. width = 200
    4. height = 100
    5. #创建指定宽度、高度、像素值都为1的图像
    6. img = np.ones((height,width),np.uint8)*255 #用1填充数组,然后再乘以255
    7. cv2.imshow("img",img)
    8. cv2.waitKey()
    9. cv2.destroyWindow()
    • 在黑色图像内部绘制白色矩形
    1. import cv2
    2. import numpy as np
    3. width = 200
    4. height = 100
    5. #创建指定宽度、高度、像素值都为0的图像
    6. img = np.zeros((height,width),np.uint8) #用0填充数组
    7. # 图像纵坐标为25~75、横坐标为50~100之间的区域变为白色
    8. img[25:75,50:100] = 255
    9. cv2.imshow("img",img)
    10. cv2.waitKey()
    11. cv2.destroyWindow()
    • 创建彩色图像
    1. import cv2
    2. import numpy as np
    3. width = 200
    4. height = 100
    5. #创建指定宽度、高度、像素值都为0的图像
    6. img = np.zeros((height,width,3),np.uint8) #用0填充数组
    7. blue = img.copy()
    8. blue[:,:,0] = 255
    9. green = img.copy()
    10. green[:,:,1] = 255
    11. red = img.copy()
    12. red[:,:,2] = 255
    13. cv2.imshow("blue",blue)
    14. cv2.imshow("green",green)
    15. cv2.imshow("red",red)
    16. cv2.waitKey()
    17. cv2.destroyWindow()
    5、图像拼接
    • 水平拼接数组

    1. array = numpy.hstack(tup)
    2. 参数说明:
    3. tup:要拼接的数组元组
    4. 返回值说明:
    5. array:将参数元组中的数组水平拼接后生成的新数组
    • 垂直拼接数组
    1. array = numpy.vstack(tup)
    2. 参数说明:
    3. tup:要拼接的数组元组
    4. 返回值说明:
    5. array:将参数元组中的数组垂直拼接后生成的新数组
    • 拼接图像
    1. import cv2
    2. import numpy as np
    3. img = cv2.imread("E:/images/avatar.png")
    4. img_h = np.hstack((img,img))
    5. img_v = np.vstack((img,img))
    6. cv2.imshow("img_h",img_h)
    7. cv2.imshow("img_v",img_v)
    8. cv2.waitKey()
    9. cv2.destroyWindow()
    五、总结

  • 相关阅读:
    集成学习思想
    第14章_视图
    Python深度学习032:conda操作虚拟环境env的全部命令
    VBA工程加密PJ方式(两种)
    emcc emsdk install
    1024——今天我们不加班
    纯CSS 实现 img 图片换色
    3. 数组+【矩阵压缩存储】:对称、三角、三对角、稀疏矩阵
    jmeter使用csv进行参数化及(运行后出现乱码错误解决)
    质量问题难解又遇监管新规,觅光能否继续“追光”?
  • 原文地址:https://blog.csdn.net/m0_37911706/article/details/139843313