opencv---基本操作

opencv基本操作

  • 1. 图像的IO操作
    • 1.1 读取图像
    • 1.2 显示图像
    • 1.3 保存图像
  • 2 绘制几何图形
    • 2.1 绘制直线
    • 2.2 绘制圆形
    • 2.3 绘制矩形
    • 2.4 向图像中添加文字
    • 2.5 获取并修改图像中的像素点
    • 2.6 获取图像的属性
    • 2.7 图像通道的拆分与合并
    • 2.8 色彩空间的改变
  • 总结

1. 图像的IO操作

1.1 读取图像

API接口函数为cv.imread(path, int),参数为:

  • 要读取的图像文件位置
  • 读取方式的标志
    • 1 表示cv.IMREAD*COLOR:以彩色模式加载图像,任何图像的透明度都将被忽略。是默认参数。
    • 0 表示cv.IMREAD*GRAYSCALE:以灰度模式加载图像
    • -1 表示cv.IMREAD_UNCHANGED:包括alpha通道的加载图像模式
      flag标志解释:flag
import cv2 as cv
# 以灰度图的形式读取图像
img = cv.imread("cat.jpg", 0)

1.2 显示图像

API接口为 cv.imshow()
参数:

  • 显示图像的窗口名称,以字符串类型表示
  • 要加载的图像(读取图像后的变量名)
import cv2 as cv
img = cv.imread("cat.jpg", 0) # 读取图像
print("image的大小为:", img.shape)
# 显示图像
cv.imshow("image", img)
cv.waitKey(0)  # 在给定的时间内(ms单位级)等待用户按键触发;当用户有按下键时,接续等待

1.3 保存图像

API接口:cv.imwrite(path, image)
参数:

  • 文件路径
  • 要保存的图像
import cv2 as cv
cv.imwrite("saveimage.png", img)

2 绘制几何图形

2.1 绘制直线

cv.line(img, start, end, color, thickness)
参数:

  • img:需要绘制直线的图像
  • start,end:直线的起点和终点(二者都为二维元组数,表示在图中的坐标)
  • color:线条的颜色
  • Thickness:线条宽度
  • lineType:线条类型。线条类型介绍
  • shift 坐标点小数点位数,相当于缩放
import cv2 as cv
import numpy as np
# 生成或读取要绘制直线的图像
img = np.zeros((320,320,3), np.uint8) # 利用numpy生成一灰度图像矩阵(值为0)

# 起点坐标 终点坐标
l_start = (50,200)
l_end =  (200, 50)  # 起始点和终点坐标为图像矩阵范围内的元组数据
# 线条颜色
l_color = (255, 0, 0) # BGR规则 8位 三元组
# 线条宽度
thickness = 1  # 整形数据
# 线类型
lineType = cv.LINE_8    # 8连接线
# lineType = cv.LINE_4
# lineType = cv.LINE_AA  # 锯齿线
cv.line(img, l_start, l_end, l_color, thickness, l_type)

cv.namedWindow("line_image")
cv.imshow("line_image", img)
cv.waitKey(10000)
cv.destroyAllWindows()

2.2 绘制圆形

API接口:
cv.circle(img, centerpoint, r, color, thickness)
参数:

  • img:要绘制圆形的图像
  • centerpoint:圆心坐标,二维元组
  • r:半径,整形数据
  • color:线条颜色:BGR,三维元组
  • thickness:线条宽度,为-1时生成闭合图案并填充颜色
  • linetype:圆边框线形 可为0 ,4 ,8
  • shift:圆心坐标和半径的小数点位数
import cv2 as cv
import numpy as np

img = np.zeros((260, 260, 3), np.uint8)  # 生成一个灰度图像
print("image的大小为:", img.shape)

# 绘制圆形
c_c = (50, 50)
c_r = 10
c_color = (0, 255, 0) 
thickness = 1
# thickness = -1
c_type = 4
# c_type = 8
# c_type = 0

cv.circle(img, c_c, c_r, c_color, thickness, c_type)
 
cv.namedWindow("circle")
cv.imshow("circle", img)
cv.waitKey(10000)
cv.destroyAllWindows()

2.3 绘制矩形

API接口:
cv.rectangle(img, leftupper, rightdown, color, thickness, lineType, shift)
参数:

  • img:要绘制矩形的图像
  • leftupper:矩形左上角,二维元组
  • rightdown:矩形右下角, 二维元组
  • color:线条颜色
  • thickness:线条宽度, 整形数据
  • linetype:线条类型,8-connected line,4-connected line, CV_AA - antialiased line
  • shift:坐标点小数点位数
import numpy as np
import cv2 as cv

img = np.zeros((300, 300, 3 ), np.uint8)# 生成一个灰度图像
print("image的大小为:", img.shape)

# 矩形左上角
r_lu = (100, 100)
# 矩形右下角
r_rd = (200, 200) 
# 线条颜色
r_color = (0, 255, 0)  # BGR 三维数据
# 线条宽度
r_thickness = 4  # 整形数据
# 线条类型
lineType = cv.LINE_8
# lineType = cv.LINE_4
# lineType = cv.LINE_AA 
cv.rectangle(img, r_lu, r_rd, r_color, r_thickness, lineType)

cv.namedWindow("rectangle")
cv.imshow("rectangle", img)
cv.waitKey(10000)
cv.destroyAllWindows()

2.4 向图像中添加文字

API接口:
cv.putText(img, text, station, font, fontsize, color, thickness, lineType, bottomLeftOrigin)
参数:

  • img:要添加文字的图像
  • text:要添加的文字
  • station:文字在图像中的左下角坐标,二维数组
  • font:字体
  • fontsize:字大小
  • color:字体颜色
  • thickness:字宽度
  • linttpe:线条类型:8-connected line,4-connected line, CV_AA - antialiased line
  • bottomLeftOrigin:为true时,图像数据原点在左下角,否则在左上角
import numpy as np
import cv2 as cv

img = np.zeros((300, 300, 3), np.uint8)

# 添加文字
text = "opencv"
# 文字左下角坐标
station = (60, 60)
# 字体
font = cv.FONT_HERSHEY_COMPLEX
# 字大小
font_size = 0.5
# 字颜色
font_color = (0, 255, 0)  # BGR
# 线条宽度
thickness = 4
# 线条类型
lineType = cv.LINE_8
# lineType = cv.LINE_4
# lineType = cv.LINE_AA 

cv.putText(img, text, station, font, font_size, font_color, thickness, lineType)

2.5 获取并修改图像中的像素点

根据行和列的坐标值来获取该像素点的像素值。对于BGR图像,返回一个蓝、绿、红的数组。对于灰度图像,仅返回相应的强度值。同时,可以使用相同方法进行像素值修改。
如:

import cv2 as cv

img = cv.imread("./cat.jpeg", 3)
# 获取某点的像素值
px = img[100, 100]
# 仅获取蓝色通道的强度值
blue = img[100, 100, 0]
# 修改某个位置的像素值
img[100, 100] = [255, 255, 255] 

2.6 获取图像的属性

图像属性包括行数、列数和通道数,图像数据类型,像素数等

import cv2 as cv

img = cv.imread("./cat.jpeg", 3)
# 图像形状
img_shape = img.shape
# 图像大小
img_size = img.size
# 图像数据类型
img_dtype = img.dtype  

2.7 图像通道的拆分与合并

有时需要在B,G,R通道图像上单独工作。在这种情况下,需要将BGR图像分割为单个通道。或者在其他情况下,可能需要将这些单独的通道合并到BGR图像。你可以通过以下方式完成。

import cv2 as cv

img = cv.imread("./cat.jpg", 3)
# 通道拆分
b, g, r = cv.split(img)
# 通道合并
img = cv.merge((b, g, r))

2.8 色彩空间的改变

OpenCV中有150多种颜色空间转换方法。最广泛使用的转换方法有两种,BGR↔Gray和BGR↔HSV。

import cv2 as cv

cv.cvColor(input_image, flag)

参数:

  • input_image: 进行颜色空间转换的图像
  • flag: 转换类型
    • cv.COLOR_BGR2GRAY : BGR↔Gray
    • cv.COLOR_BGR2HSV: BGR→HSV

总结

  1. 图像IO操作的API:
    • cv.imread(path, flag) 读取图像,path为路径,flag为读取方式
    • cv.imshow(window_name, img) 显示图像,window_name为窗口名,img为图像变量名
    • cv.imwrite(save_path, img) 保存图像,save_path为保存路径,img为要保存的图像
  2. 在图像上绘制几何图像
    • cv.line() 绘制直线
    • cv.circle() 绘制圆形
    • cv.rectangle() 绘制矩形
    • cv.putText() 在图像上添加文字
  3. 获取并修改图像中的像素点
    • px = img[100, 100] 获取某点的像素值
    • blue = img[100, 100, 0] 仅获取蓝色通道的强度值
    • img[100, 100] = [255, 255, 255] 修改某个位置的像素值
  4. 获取图像的属性
    • img.shape
    • img.size
    • img.dtype
  5. 拆分或合并通道
    • b, g, r = cv.split(img) 通道拆分
    • img = cv.merge((b, g, r)) 通道合并
  6. 色彩空间的改变
    • cv.cvtColor(input_image,flag)

你可能感兴趣的:(opencv,计算机视觉)