• 【opencv图像处理】--2. 颜色空间,绘制图形,绘制(中文)文本


    系列所有代码,复制粘贴即可运行。
    希望有能力的朋友还是拿C++运行一下,python对opencv再封装的时候,少了一些C库中的对象和方法。

    本节讨论对颜色空间BGR,HSV等的转换,图像在opencv库中的数据结构,颜色三通道的合并分离,图形绘制和中英文文本绘制等

    1. 颜色空间的基础知识

    HSV也叫HSB,opencv用的最多,使用方便。

    • H:Hue 色相,如红色蓝色,用角度衡量,范围0–360, 红色0 绿色120 蓝色240
    • S:Saturation 饱和度,通常0–100,值越大颜色越饱和,就越鲜艳, 混入白色的量, 白色越少,饱和度越高
    • V/B:Value/Brightness 明度 范围0(黑)–100(白) 表示颜色明亮程度, 混入黑色的量,褐色越少,明度越高

    HSL在顶部是纯白的,色相H与HSV完全一致,但是S和L不一样,S与混入黑白颜色量,没有关系:

    • H: 色相
    • S: 饱和度 指的是颜色的纯度 类似于加水的稀释程度
    • L: 明度 颜色明亮程度 控制纯色中混入的黑白两种颜色

    YUV考虑到人类感知能力 允许降低色度的带宽 占用极少的带宽 多用于电视中

    • Y: luma 灰阶值 明亮度 最早的黑白电视只有Y
    • UV: chroma 色度 描述影响的色彩和饱和度 用于指定像素的颜色
    • 极少带宽 采样按百分比 4:4:4 完全 4:2:0 4个Y两个U没有V

    1.1 色彩空间转换

    import cv2 
    
    def callback(value):
        pass
    
    cv2.namedWindow('color', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('color', 640, 480)
    
    img = cv2.imread('cat.jpeg')
    
    #常见颜色空间转换
    colorspaces = [cv2.COLOR_BGR2RGBA, cv2.COLOR_BGR2BGRA, cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2HSV,cv2.COLOR_BGR2YUV]
    cv2.createTrackbar('curcolor', 'color', 0, 4, callback)
    
    while True:
        index = cv2.getTrackbarPos('curcolor','color')
        
        #颜色空间转换API
        cvt_img = cv2.cvtColor(img, colorspaces[index])
        
        cv2.imshow('color', cvt_img)
        key = cv2.waitKey(10)
        
        if key & 0xff == ord('q'):
            break
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    2. mat数据结构的深浅拷贝

    mat是储存图像的数据结构(C++)
    但是在python中已经将其二次封装为ndarray格式了,丢失一些属性(成员函数)

    ndarray的常见属性

    • data:表地址,直接访问不到
    • size: 元素的总个数
    • dtype: 格式
    • shape: 形状
    # mat数据之共享头
    # mat的深浅拷贝
    import cv2 
    import numpy as np
    
    img = cv2.imread('cat.jpeg')
    
    # 浅拷贝:头尾都相连
    img2 = img.view()  #创建一个视图
    
    # 深拷贝, 只有头部相连
    img3 = img.copy()
    
    img[10:100, 10:100] = [0, 0, 255]
    
    ##横着堆叠
    #cv2.imshow('img', np.hstack((img, img2, img3)))
    
    #竖着堆叠
    cv2.imshow('img', np.vstack((img, img2, img3)))
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    3.颜色通道的分离和合并

    import cv2
    import numpy as np
    
    #img = np.zeros((480, 640, 3), np.uint8)
    img = cv2.imread('cat.jpeg')
    b,g,r = cv2.split(img)
    
    b[10:100, 10:100] = 255
    g[10:100, 10:100] = 255
    
    img2 = cv2.merge((b, g, r))
    
    cv2.imshow('img', img)
    cv2.imshow('b', b)
    cv2.imshow('g', g)
    cv2.imshow('img2', img2)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4. 绘制图形

    1. 画直线line(img, pt1, pt2, color, thickness, lineType, shift):
    • img: 在哪个图像上划线
    • pt1, pt2: 起始点,结束点
    • color: 画笔颜色
    • thickness: 线宽
    • lineType: 线型 有-1,4,8,16 默认8
    • shift: 坐标缩放比例
    1. rectangle()参数同上 画矩形
    2. circle(img, center, radius, color[,thickness[, lineType[, shift]]]):
    • 画圆,括号内表示可选参数
    1. 画椭圆ellipse(img, center, 长宽的一半,角度,从哪个角度开始,从哪个角度结束)
    2. 画多边形 polylines
    
    import cv2
    import numpy as np
    
    img = np.zeros((480, 640, 3), np.uint8)
    
    ##划线只有实线
    ## cv2.line(img, (10, 20), (300, 400), (0, 0, 255), 5, 4)
    ## cv2.line(img, (80, 100), (380, 480), (0, 0, 255), 5, 16)
    
    '''
    ##1111111111 矩形的起终点是矩形的对角点
    cv2.rectangle(img, (10, 10), (200, 200), (0, 255, 0), 5)
    '''
    
    
    '''
    ##22222222222  圆形 最后是线宽和去毛刺
    cv2.circle(img, (320, 240), 200, (0, 0, 255), 10, 16)
    '''
    
    
    '''
    ##3333333333333 椭圆 用矩形框椭圆 
    ## 画椭圆ellipse(img, center, 长宽的一半,角度,从哪个角度开始,从哪个角度结束)
    #可以只画局部 控制开始角度和结束角度0 ,360
    #可以任意角度控制椭圆,参数angle
    cv2.ellipse(img, (320, 240), (200, 50), 0, 0, 360, (0, 0, 255), 5, 16)
    #cv2.ellipse(img, (320, 240), (200, 50), 45, 0, 360, (0, 0, 255), 5, 16)
    #cv2.ellipse(img, (320, 240), (200, 50), 0, 0, 180, (0, 0, 255), 5, 16)
    '''
    
    ##44444444444 画多边形和填充多边形,多个点连起来
    #多边形点集, 32位是C语言底层的规定
    pts = np.array([(250, 10), (10, 30),(150, 100), (450, 100)], np.int32)
    #cv2.polylines(img, [pts], True, (0, 0, 255), 8)
    cv2.fillPoly(img, [pts], (0, 0, 255), 8)
    
    cv2.imshow('draw', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    5. 绘制英文和中文文本

    绘制英文文本和中文文本
    putText
    从左下角开始算

    • 显示中文得额外操作:

    5.1 英文

    
    import cv2
    import numpy as np
    #org 文本框左下角的定位
    img = np.zeros((480, 640, 3), np.uint8)
    #cv2.putText(img, 'Hello Kitti', (50, 200), cv2.FONT_HERSHEY_COMPLEX, 3, [0, 0, 255])
    
    cv2.imshow('draw', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5.2 中文

    曲线救国,使用pillow,再转为opencv显示

    • 导入字体: C://windows//font 下是电脑里的所有字体,复制想要的字体到我们的路径下,我这里复制的是hyswlongfangsong.ttf字体
    
    import cv2
    import numpy as np
    from PIL import ImageFont, ImageDraw, Image
    #显示中文
    #全白
    img = np.full((500, 500, 3), fill_value=255, dtype=np.uint8)
    
    #导入字体: C://windows//font 下是电脑里的所有字体,复制想要的字体到我们的路径下
    #这里调整字体大小
    font = ImageFont.truetype('hyswlongfangsong.ttf', 35)
    
    #创建一个pillow图片
    img_pil = Image.fromarray(img)
    
    draw = ImageDraw.Draw(img_pil)
    
    #利用draw绘制中文
    draw.text((100, 250), '但很快就撒', font=font, fill=(0, 0, 0, 0))
    
    #重新变回ndarray
    img = np.array(img_pil)
    
    cv2.imshow('draw', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    Coredump-n: 内存占用太多导致应用程序起不来的一例
    基于JavaSwing开发超市收银系统的设计与实现+论文+开题报告+任务书+PPT 毕业设计
    java118-vector类
    Facebook Delos 中的虚拟共识协议
    电容笔和触屏笔一样吗?大学生开学需要准备的东西清单
    【无标题】
    C语言从入门到精通 第七章(利用数组处理批量数据)
    Spring Cloud--@RefreshScope动态刷新的原理
    pandas数据离散化
    记一次 .NET某质量检测中心系统 崩溃分析
  • 原文地址:https://blog.csdn.net/Eric_Sober/article/details/125994052