opencv-python学习笔记4-图像处理模块

目录

一、颜色变换cvtColor:

(1)函数原型:

(2)参数:

(3)作用:

(4)颜色空间转换代码:

(5)示例:

二、画基本图形:

(1)画线条:

(2)画矩形:

(3)画圆形:

(4)画多边形:

(5)画点:

(6)画椭圆: 

(7)画填充多边形: 

 三、文字绘制: 

(1)文字绘制:

 (2)绘制中文:

四、为图像添加边框:

(1)函数原型:

(2)参数:

(3)示例代码:

​ 五、在图像中查找轮廓:

(1)使用 OpenCV 查找图像轮廓的步骤:

(2)示例代码:

 


一、颜色变换cvtColor:

cv2.cvtColor 是 OpenCV 库中的一个函数,用于转换图像的颜色空间。

(1)函数原型:

cv2.cvtColor(src, code[, dst[, mask]])

(2)参数:

  • src: 输入图像。
  • code: 指定转换的颜色空间。这是一个整数,表示从一种颜色空间转换到另一种颜色空间的代码。
  • dst: (可选)输出图像。如果提供,必须与源图像具有相同的尺寸和类型。
  • mask: (可选)操作的可选掩码。如果提供,它必须是8位的单通道图像,大小与源图像相同。

(3)作用:

  • cv2.cvtColor 函数用于将图像从一个颜色空间转换到另一个颜色空间。例如,它可以将图像从 BGR 转换为灰度、RGB、HSV 等。

(4)颜色空间转换代码:

一些常用的颜色空间转换代码:

  • cv2.COLOR_BGR2BGRA: BGR 到 BGRA 转换。
  • cv2.COLOR_BGR2GRAY: BGR 到灰度转换。
  • cv2.COLOR_BGR2RGB: BGR 到 RGB 转换。
  • cv2.COLOR_BGR2RGBA: BGR 到 RGBA 转换。
  • cv2.COLOR_BGR2HSV: BGR 到 HSV 转换。
  • cv2.COLOR_BGR2Lab: BGR 到 CIELAB 转换。
  • cv2.COLOR_BGR2Luv: BGR 到 CIE Luv 转换。
  • cv2.COLOR_BGR2YUV: BGR 到 YUV 转换。
  • cv2.COLOR_RGB2GRAY: RGB 到灰度转换。
  • cv2.COLOR_RGB2YUV: RGB 到 YUV 转换。
  • cv2.COLOR_GRAY2BGR: 灰度到 BGR 转换。
  • cv2.COLOR_GRAY2RGB: 灰度到 RGB 转换。

(5)示例:

使用 cv2.cvtColor 函数的示例代码:

import cv2

# 读取一个 BGR 图像
image = cv2.imread("C:\\Users\\86173\\Desktop\\TI\\faves.png")

# 将 BGR 图像转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 将 BGR 图像转换为 HSV 图像
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 显示灰度图像
cv2.imshow('Gray Image', gray_image)
#cv2.waitKey(0)

# 显示 HSV 图像
cv2.imshow('HSV Image', hsv_image)
cv2.waitKey(0)

cv2.destroyAllWindows()()

 

二、画基本图形:

在 OpenCV 中,可以使用多种函数来绘制基本图形,如线条、矩形、圆形、多边形等。

(1)画线条:

cv2.line 函数用于在图像上绘制线条。

函数原型:

cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
  • img: 输入图像。
  • pt1: 线条的起点。
  • pt2: 线条的终点。
  • color: 线条的颜色。
  • thickness: 线条的厚度(默认为 1)。
  • lineType: 线条的类型,如 cv2.LINE_4cv2.LINE_8(默认)。
  • shift: 坐标点的小数点位数。

示例代码:

import cv2
import numpy as np

# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)

# 画一条蓝色线条
cv2.line(image, (50, 50), (300, 300), (255, 0, 0), 3)

# 显示图像
cv2.imshow('Line Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

(2)画矩形:

cv2.rectangle 函数用于在图像上绘制矩形。

函数原型:

cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
  • pt1: 矩形的一个角点。
  • pt2: 矩形对角的点。

示例代码:

# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)

# 画一个绿色矩形
cv2.rectangle(image, (50, 50), (300, 300), (0, 255, 0), 3)

# 显示图像
cv2.imshow('Rectangle Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

(3)画圆形:

cv2.circle 函数用于在图像上绘制圆形。

函数原型:

cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
  • center: 圆心的坐标。
  • radius: 圆的半径。
  • color: 圆的颜色。

示例代码:

# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)

# 画一个红色圆形
cv2.circle(image, (200, 200), 100, (0, 0, 255), 3)

# 显示图像
cv2.imshow('Circle Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

(4)画多边形:

cv2.polylines 函数用于在图像上绘制多边形。

函数原型:

cv2.polylines(img, [pts], isClosed, color[, thickness[, lineType[, shift]]])
  • pts: 多边形的顶点,格式为一个数组的列表。
  • isClosed: 是否闭合多边形。

示例代码:

# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)

# 定义多边形的顶点
pts = np.array([[100, 100], [200, 100], [200, 200], [100, 200]], np.int32)
pts = pts.reshape((-1, 1, 2))

# 画一个多边形
cv2.polylines(image, [pts], isClosed=True, color=(255, 255, 0), thickness=3)

# 显示图像
cv2.imshow('Polygon Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

(5)画点:

  • 使用 cv2.circle 绘制点

函数原型:

cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
  • img: 输入图像。
  • center: 圆心的位置,以 (x, y) 坐标表示。
  • radius: 圆的半径。
  • color: 圆的颜色,以 BGR 格式表示。
  • thickness: 圆的线条粗细。如果设置为 -1,则填充整个圆。

示例代码:

import cv2
import numpy as np

# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)

# 画一个红色的点
cv2.circle(image, (200, 200), 1, (0, 0, 255), 8)

# 显示图像
cv2.imshow('Point Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

  • 使用 cv2.drawMarker 绘制点

函数原型:

cv2.drawMarker(img, position, color[, markerType[, markerSize[, thickness[, line_type]]])
  • img: 输入图像。
  • position: 点的位置,以 (x, y) 坐标表示。
  • color: 点的颜色,以 BGR 格式表示。
  • markerType: 点的类型,cv2.MARKER_CROSS(十字标记 或 cv2.MARKER_STAR (星)等。
  • markerSize: 点的大小。
  • thickness: 点的线条粗细。
  • line_type: 点的线条类型。

示例代码:

import cv2
import numpy as np

# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)

# 画一个绿色的点
cv2.drawMarker(image, (200, 200), (0, 255, 0), markerType=cv2.MARKER_CROSS, markerSize=10, thickness=2)

# 显示图像
cv2.imshow('Point Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

(6)画椭圆: 

在 OpenCV 中,可以使用 cv2.ellipse 函数来绘制椭圆。这个函数允许您指定椭圆的中心位置、轴的长度、旋转角度以及起始和结束角度,从而在图像上绘制椭圆或椭圆的一部分。

函数原型:

cv2.ellipse(img, center, axes, angle, startAngle, endAngle,
 color[, thickness[, lineType[, shift]]])

参数:

  • img: 输入图像。
  • center: 椭圆的中心点坐标,以 (x, y) 格式。
  • axes: 椭圆的轴长度,以 (width, height) 格式。
  • angle: 椭圆的倾斜角度。
  • startAngle: 椭圆的起始角度。
  • endAngle: 椭圆的结束角度。
  • color: 椭圆的颜色,以 BGR 格式。
  • thickness: 椭圆线条的粗细。如果设置为 -1,则填充整个椭圆。
  • lineType: 线条的类型,如 cv2.LINE_4cv2.LINE_8 等。
  • shift: 坐标点的小数点位数。

示例代码:

cv2.ellipse 函数绘制椭圆的示例:

import cv2
import numpy as np

# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)

# 绘制一个蓝色椭圆
cv2.ellipse(image, (200, 200), (150, 100), 0, 0, 360, (255, 0, 0), 3)

# 显示图像
cv2.imshow('Ellipse Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

(7)画填充多边形: 

在 OpenCV 中,可以使用 cv2.fillPoly 函数来填充多边形。这个函数允许您指定多边形的顶点,并将其内部区域填充为指定的颜色。

函数原型:

cv2.fillPoly(img, pts, color)

参数:

  • img: 输入图像。
  • pts: 多边形的顶点,格式为一个包含顶点数组的列表,其中每个顶点数组是一个形状为 (n, 1, 2) 的 NumPy 数组。
  • color: 填充颜色,以 BGR 格式表示。

示例代码:

cv2.fillPoly 函数填充多边形的示例:

import cv2
import numpy as np

# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)

# 定义多边形的顶点
# 例如,一个三角形的三个顶点
pts = np.array([[100, 100], [200, 100], [150, 200]], np.int32)
pts = pts.reshape((-1, 1, 2))

# 填充多边形
cv2.fillPoly(image, [pts], (0, 255, 0))  # 使用绿色填充

# 显示图像
cv2.imshow('Filled Polygon', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

绘制更复杂的多边形:

  想要填充一个更复杂的多边形,只需添加更多的顶点即可:

# 定义一个更复杂的多边形的顶点
pts = np.array([[100, 100], [200, 100], [250, 200], [100, 250], [50, 200]], np.int32)
pts = pts.reshape((-1, 1, 2))

# 填充多边形
cv2.fillPoly(image, [pts], (255, 0, 0))  # 使用蓝色填充

 

 三、文字绘制: 

(1)文字绘制:

在 OpenCV 中,可以使用 cv2.putText 函数在图像上绘制文本。这个函数允许您指定文本字符串、位置、字体、大小、颜色等属性。

函数原型:

cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])

参数:

  • img: 输入图像。
  • text: 要绘制的文本字符串。
  • org: 文本在图像中的位置(左下角的坐标)。
  • fontFace: 字体类型,例如 cv2.FONT_HERSHEY_SIMPLEX
  • fontScale: 字体缩放因子。
  • color: 文本的颜色,以 BGR 格式表示。
  • thickness: 文本的线条粗细。
  • lineType: 线条的类型,如 cv2.LINE_4cv2.LINE_8 等。
  • bottomLeftOrigin: 如果设置为 True,则图像的原点在左下角;如果设置为 False(默认),则原点在左上角。

示例代码:

  • cv2.putText 函数在图像上绘制文本的示例:
import cv2
import numpy as np

# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)

# 在图像上绘制白色文本
cv2.putText(image, 'Hello, OpenCV', (50, 200), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)

# 显示图像
cv2.imshow('Text Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

更多字体选项:

OpenCV 提供了多种字体类型,例如:

  • cv2.FONT_HERSHEY_SIMPLEX
  • cv2.FONT_HERSHEY_PLAIN
  • cv2.FONT_HERSHEY_DUPLEX
  • cv2.FONT_HERSHEY_COMPLEX
  • cv2.FONT_HERSHEY_TRIPLEX
  • cv2.FONT_HERSHEY_COMPLEX_SMALL
  • cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
  • cv2.FONT_HERSHEY_SCRIPT_COMPLEX

文本位置调整:

  • 可以调整文本的位置,使其在图像中居中显示:
text_size = cv2.getTextSize('Hello, OpenCV', cv2.FONT_HERSHEY_SIMPLEX, 1, 2)
text_x = (image.shape[1] - text_size[0]) // 2
text_y = (image.shape[0] + text_size[1]) // 2
cv2.putText(image, 'Hello, OpenCV', (text_x, text_y), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
  • 使用 cv2.getTextSize 函数计算文本的尺寸,然后根据图像的尺寸和文本的尺寸计算文本的位置,使其在图像中水平和垂直居中。

 (2)绘制中文:

OpenCV 的 cv2.putText 函数默认不支持中文字符,因为它使用的是简单的字体渲染,这些字体通常不包含中文字符集。要在图像上绘制中文文本,需要使用其他库,如 Pillow(PIL)。

(1)安装 Pillow 库。如果没有安装,可以使用 pip 安装:

pip install pillow

(2)代码示例:

from PIL import Image, ImageDraw, ImageFont
import numpy as np
import cv2

# 创建一个黑色背景的图像
image = np.zeros((400, 400, 3), dtype=np.uint8)

# 将 OpenCV 图像转换为 PIL 图像
pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

# 创建一个绘图对象
draw = ImageDraw.Draw(pil_image)

# 定义中文字体和大小
font = ImageFont.truetype("simsun.ttc", 24)  # simsun.ttc 是 Windows 系统中的宋体字体

# 在图像上绘制中文文本
draw.text((50, 50), "你好,OpenCV", font=font, fill=(255, 255, 255))

# 将 PIL 图像转换回 OpenCV 图像
image = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)

# 显示图像
cv2.imshow('Chinese Text Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、为图像添加边框:

在 OpenCV 中,为图像添加边框可以使用 cv2.copyMakeBorder 函数。这个函数可以在图像的边缘添加边框,并且可以指定边框的宽度、类型、颜色等。

(1)函数原型:

cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value[, dst[, dstsize[, centerize]]])

(2)参数:

  • src: 输入图像。
  • top: 图像上方边框的宽度。
  • bottom: 图像下方边框的宽度。
  • left: 图像左侧边框的宽度。
  • right: 图像右侧边框的宽度。
  • borderType: 边框的类型,如 cv2.BORDER_CONSTANTcv2.BORDER_REPLICATE 等。
  • value: 边框的颜色,对于彩色图像,应该是一个包含三个元素的元组(BGR)。
  • dst: 输出图像。
  • dstsize: 输出图像的大小。
  • centerize: 是否将原图像居中。

(3)示例代码:

  • cv2.copyMakeBorder 函数为图像添加边框的示例:
import cv2
import numpy as np
# 读取一个图像
src = cv2.imread("C:\\Users\\86173\\Desktop\\TI\\faves.png")

# 为图像添加红色边框
border_color = (0, 0, 255)  # BGR格式的红色
dst = cv2.copyMakeBorder(src, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=border_color)

# 创建一个足够大的黑色背景图像
image = np.zeros((dst.shape[0] + 100, dst.shape[1] + 100, 3), dtype=np.uint8)

# 将带有边框的图像显示在黑色背景上
image[25:25+dst.shape[0], 25:25+dst.shape[1]] = dst

# 显示图像
cv2.imshow('Image with Border', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 五、在图像中查找轮廓:

在 OpenCV 中,查找图像中的轮廓是一个常见的操作,通常用于图像识别、对象检测和图像分析。轮廓是图像中连续的边缘点的集合,可以用于描述物体的外形。

(1)使用 OpenCV 查找图像轮廓的步骤:

  • 转换图像到灰度格式。
  • 应用边缘检测(如 Canny 算子)。
  • 查找轮廓。
  • (可选)绘制轮廓。

(2)示例代码:

import cv2
import numpy as np

# 读取图像
image = cv2.imread("C:\\Users\\86173\\Desktop\\TI\\faves.png")

# 转换到灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 应用高斯模糊,减少图像噪声
blurred = cv2.GaussianBlur(gray, (5, 5), 0)

# 应用 Canny 边缘检测
edges = cv2.Canny(blurred, 50, 150)

# 查找轮廓
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 绘制轮廓(可选)
# 创建一个全黑的图像用于绘制轮廓
contour_image = np.zeros_like(image)
# 绘制所有轮廓
cv2.drawContours(contour_image, contours, -1, (0, 255, 0), 3)

# 显示原始图像和轮廓图像
cv2.imshow('Original Image', image)
cv2.imshow('Contours', contour_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

  • 首先读取一个图像,并将其转换为灰度图像。然后,应用高斯模糊来减少图像噪声,接着使用 Canny 算子进行边缘检测。之后,我们使用 cv2.findContours 函数查找边缘检测结果中的轮廓。最后创建了一个新的图像 contour_image 并使用 cv2.drawContours 函数在其中绘制轮廓。
  • 可以调整 Canny 算子的阈值和高斯模糊的内核大小,以获得最佳的轮廓检测结果。

 (3)findContours 函数:

cv2.findContours 是 OpenCV 中一个非常重要的函数,用于检测图像中的轮廓。这个函数可以找到所有连通的边缘点,并将其组织成轮廓列表。

函数原型:

在 OpenCV 3 和 OpenCV 4 中,cv2.findContours 函数的原型略有不同:

对于 OpenCV 3:

cv2.findContours( image, mode, method, contours=None, hierarchy=None )

对于 OpenCV 4:

cv2.findContours( image, mode, contours=None, hierarchy=None, retval=None )

参数:

  • image: 输入图像,必须是单通道二值图像(即边缘检测后的图像)。
  • mode: 轮廓检索模式,可以是:
    • cv2.RETR_EXTERNAL: 只检索最外层的轮廓。
    • cv2.RETR_LIST: 检索所有轮廓,不建立任何父子关系。
    • cv2.RETR_CCOMP: 检索所有轮廓,并重建它们的层次结构。
    • cv2.RETR_TREE: 检索所有轮廓,并重建完整的层次结构。
  • method: 轮廓近似方法,可以是:
    • cv2.CHAIN_APPROX_SIMPLE: 只保留轮廓的拐点信息。
    • cv2.CHAIN_APPROX_NONE: 保留轮廓上的所有点。
  • contours: 用来存储检测到的轮廓的列表或向量。
  • hierarchy: 可选输出参数,包含轮廓的层次信息。
  • retval: 可选输出参数,用于存储图像的修改后的版本,其中非零像素表示轮廓。

返回值:

  • contours: 检测到的轮廓列表。
  • hierarchy: 可选,包含轮廓的层次结构。

 

  • 34
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值