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

“人群里敞着一扇门”

  • 1. 颜色空间的基础知识
    • 1.1 色彩空间转换
  • 2. mat数据结构的深浅拷贝
    • ndarray的常见属性
  • 3.颜色通道的分离和合并
  • 4. 绘制图形
  • 5. 绘制英文和中文文本
    • 5.1 英文
    • 5.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()

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()

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()

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()

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()

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()

你可能感兴趣的:(#,图像处理,opencv,图像处理,计算机视觉,python,jupyter)