OpenCV-图片操作

一.多种形态学

  • 形态学变换(Morphological Transformations)是一种基于形状的简单变换,它的处理对象通常是二值化图像。形态学变换有两个输入,一个输出:输入为原图像、核(结构化元素),输出为形态学变换后的图像。

1.核

  • 核(kernel)其实就是一个小区域,通常为3*3、5*5、7*7大小,有着其自己的结构,比如矩形结构、椭圆结构、十字形结构,如下图所示。

结构元素 (Kernel)

  • cv2.getStructuringElement(shape, ksize)
    • shape : 形状类型,包括:
      • cv2.MORPH_RECT:矩形。
      • cv2.MORPH_ELLIPSE:椭圆。
      • cv2.MORPH_CROSS:交叉。
    • ksize : 结构元素的大小,通常是一个tuple,例如(width, height)

1.1. cv2.MORPH_RECT

cv2.MORPH_RECT代表矩形结构元素。它是一个矩形的内核,可以用于执行基本的形态学操作,例如膨胀、腐蚀、开运算和闭运算。

  • 用途:矩形结构元素常用于处理具有显然水平和垂直特征的图像,比如文本和边框。
  • 创建方式 :可以通过cv2.getStructuringElement(cv2.MORPH_RECT, (宽度, 高度))来创建。
python 复制代码
import cv2
import numpy as np

# 创建一个3x5的矩形结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 5))

1.2. cv2.MORPH_ELLIPSE

cv2.MORPH_ELLIPSE代表椭圆形结构元素。它包含了一个椭圆形的内核,适用于处理形状比较圆滑的对象。

  • 用途:椭圆形结构元素通常用于图像中具有圆形或椭圆形特征的对象,能更好地保留对象的形状。
  • 创建方式 :可以通过cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (宽度, 高度))来创建。
python 复制代码
# 创建一个5x5的椭圆形结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))

1.3. cv2.MORPH_CROSS

cv2.MORPH_CROSS代表十字形结构元素。它包含一个十字形的内核动作。

  • 用途:十字符合某些特定应用的要求,例如保留图像中直线的结构,或者细化边缘。
  • 创建方式 :可以通过cv2.getStructuringElement(cv2.MORPH_CROSS, (宽度, 高度))来创建。
python 复制代码
# 创建一个5x5的十字形结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
  • 结构元素在形态学操作中起着重要作用,选择合适的形状和大小可以有效地影响图像处理的结果。通过适当的结构元素组合,您可以实现不同的图像分析和预处理效果。

2. 腐蚀(侵蚀)

  • 原理:腐蚀操作通过一个结构元素在图像上滑动,检查结构元素与图像的重叠区域。如果结构元素的每个白色像素都对应于图像中的白色像素,则中心像素被保留;否则,该像素被保留腐蚀为黑色。这样的操作使得视线的边界向内收缩。
函数:cv2.erode(image, kernel, iterations=1)
  • kernel:结构元素,用于确定腐蚀操作的形状和大小。可以使用cv2.getStructuringElement创建。
  • iterations:执行腐蚀操作的次数。值越大,腐蚀效果越明显。
    示例:
python 复制代码
import cv2
import numpy as np  
image = cv2.imread("./1.jpg",cv2.IMREAD_GRAYSCALE)#加权均值方式
kernel = np.ones((5, 5), np.uint8)  # 5x5的矩形结构元素  
eroded = cv2.erode(image, kernel, iterations=1)

cv2.imshow("image",image)
cv2.imshow("eroded",eroded)
cv2.waitKey(0)

3. 膨胀(Dilation)

膨胀操作与腐蚀相反。它通过一个结构元素图像在上滑动,检查结构元素与图像的重叠区域。如果结构元素的任何一个白色像素与图像中的白色像素重叠,则中心像素被膨胀为白色这种操作使得视线的边界向外扩展。

函数:cv2.dilate(image, kernel, iterations=1)
  • image:输入的图像,通常为灰度图像。
  • kernel:结构元素,决定膨胀操作的形状和大小。
  • iterations:执行膨胀操作的次数。值越大,膨胀效果越明显。

示例:

python 复制代码
kernel = np.ones((5, 5), np.uint8)  # 5x5的矩形结构元素  
dilated = cv2.dilate(image, kernel, iterations=1)

**

4. 开运算(Opening)

**

  • 原理:开运算是先进行腐蚀再进行膨胀。它主要用于去除较小的噪声和物体,同时保留更大的物体的形状和尺寸。开腐蚀有效地去除较小的物体和较细的噪声。(先取小,再取大)
python 复制代码
cv2.morphologyEx(src, op, kernel, iterations=1)
  • src: 输入图像。
  • op : 运算类型,这里是cv2.MORPH_OPEN
  • kernel: 结构元素,定义开运算的形状和大小。
  • iterations: 迭代次数,指定开运算的重复次数。默认为1。

示例:

python 复制代码
kernel = np.ones((5, 5), np.uint8)  # 5x5的矩形结构元素  
opened = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)

5. 闭运算 (Closing)

  • 闭运算是先进行膨胀后进行腐蚀的操作,主要用于修整小空洞,连接相邻的工件。(先取大再取小)
python 复制代码
cv2.morphologyEx(src, op, kernel, iterations=1)
  • src: 输入图像。
  • op : 运算类型,这里是cv2.MORPH_CLOSE
  • kernel: 结构元素,定义闭运算的形状和大小。
  • iterations: 迭代次数,指定闭运算的重复次数。默认为1。
python 复制代码
# 执行闭运算  
closed = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)

# 显示结果  
cv2.imshow('Closed', closed)
cv2.waitKey(0)
cv2.destroyAllWindows()

6. 礼帽运算 (Top Hat)

  • 礼帽运算是通过计算闭运算和开运算的差值来获得的,主要用于去除图像的边缘。(先取大再取小)--(先取小,再取大)
python 复制代码
cv2.morphologyEx(src, op, kernel, iterations=1)
  • src: 输入图像。
  • op : 运算类型,这里是cv2.MORPH_TOPHAT
  • kernel: 结构元素,定义操作的形状和大小。
  • iterations: 迭代次数,指定礼帽运算的重复次数。默认为1。
python 复制代码
# 执行闭运算和开运算  
top_hat = cv2.morphologyEx(image, cv2.MORPH_TOPHAT, kernel)

# 显示结果  
cv2.imshow('Top Hat', top_hat)
cv2.waitKey(0)
cv2.destroyAllWindows()

7. 黑帽运算 (Black Hat)

  • 黑帽运算是通过计算原始图像与隐藏损伤结果之间的差值来获得的,主要用于提取图像中的暗区域。
python 复制代码
cv2.morphologyEx(src, op, kernel, iterations=1)
  • src: 输入图像。
  • op : 运算类型,这里是cv2.MORPH_BLACKHAT
  • kernel: 结构元素,定义操作的形状和大小。
  • iterations: 迭代次数,指定黑帽运算的重复次数。默认为1。
python 复制代码
# 执行黑帽运算  
black_hat = cv2.morphologyEx(image, cv2.MORPH_BLACKHAT, kernel)

# 显示结果  
cv2.imshow('Black Hat', black_hat)
cv2.waitKey(0)
cv2.destroyAllWindows()

8. 形态学梯度

  • 形态学梯度(Morphological Gradient)是图像处理中的一种技术,用于提取图像中物体的边缘。它是形态学运算(如膨胀和腐蚀)的一种组合,通过计算膨胀结果与腐蚀结果之间的差异来获取边缘信息。

  • 形态学梯度:

    • 通过计算膨胀图像与腐蚀图像之间的差异来获取边缘。
    • 公式:Gradient = Dilation - Erosion
    • 结果是,图像中的物体边缘会被突出显示。
  • 视觉效果:

    • 形态学梯度提取出的边缘比传统的边缘检测方法(如Sobel算子、Canny算子)更粗一些,因为它是通过结构元素对物体进行膨胀和腐蚀的差异得到的。
    • 它通常用于前景和背景分离、边缘检测等图像分析任务
python 复制代码
import cv2
import numpy as np

# 读取图像并转为灰度图
image = cv2.imread('image.jpg', 0)

# 定义结构元素(核),通常使用3x3的矩阵
kernel = np.ones((3,3), np.uint8)

# 进行形态学梯度运算
gradient = cv2.morphologyEx(image, cv2.MORPH_GRADIENT, kernel)

# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Morphological Gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

二.颜色识别

  • 图像颜色识别是计算机视觉领域中的一个重要任务,通常涉及将图像中的颜色信息提取并进行分析。在颜色识别过程中,RGB颜色空间是最常见的颜色表示方式之一,但还有其他颜色空间,如HSV、HSL、Lab和YCbCr等,追求颜色空间在不同的应用场景中各有优缺点。

**

1. RGB 颜色空间

**

  • 1.1 定义

    • RGB颜色空间是基于红色(红色)、绿色(绿色)和蓝色(蓝色)的颜色光的加色模型。通过将这种颜色光与不同的强度组合,可以生成各种颜色。
  • 1.2 显示

    • 终点颜色的强度值通常在 0 到 255 之间

    • 黑色:RGB(0, 0, 0)

    • 白色:RGB(255, 255, 255)

    • 红色:RGB(255, 0, 0)

    • 绿色:RGB(0, 255, 0)

    • 蓝色:RGB(0, 0, 255)

  • 1.3 优点和缺点

    优点:可显示,易于理解,适用于设备(​​如

    缺点:对灯光变化敏感,难以进行颜色分割和识别,特别是在复杂的背景下。

1.3 颜色相加

  • 你可以使用OpenCV的cv.add()函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像,如res = img1 + img2。两个图像应该具有相同的大小和类型。

OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作,而Numpy添加是模运算

python 复制代码
import cv2
import numpy as np

img1=np.array([
    [[10, 20, 30], [100, 200, 255], [1, 1, 2]],

],dtype=np.uint8)
img2=np.array([
    [[10, 20, 30], [100, 200, 255], [1, 1, 2]],],dtype=np.uint8)
 
img3=img1+img2
print(img3)
#输出 [[[ 20  40  60]
#   [200 144 254]
#   [  2   2   4]]]   》》值为相加结果%256

img4=cv2.add(img1,img2)
print("img4:\n",img4)
# img4:
#  [[[ 20  40  60]
#   [200 255 255]
#   [  2   2   4]]]  》》值如果大于255,则取最大值255

2. HSV颜色空间

**

2.1 定义

HSV(色调、饱和度、值)颜色空间由色相(色调)、灌溉度(饱和度)和明度(值)组成。HSV颜色空间更符合人类的园林。

2.2 显示
色相(H):颜色类型,通常表示为 0 到 360 度。
饱和度(S):颜色的限制,从0%(灰色)到100%(纯色)
明度(V):亮度,从0%(黑色)到100%(最亮)

  • 色调H:

    • 使用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°。通过改变H的值,可以选择不同的颜色
  • 饱和度S:

    • 饱和度S表示颜色接近光谱色的程度。一种颜色可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例越大,颜色接近光谱色的程度就越高,颜色的饱和度就越高。饱和度越高,颜色就越深而艳,光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,其中0%表示灰色或无色,100%表示纯色,通过调整饱和度的值,可以使颜色变得更加鲜艳或者更加灰暗。
  • 明度V:

    • 明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白),通过调整明度的值,可以使颜色变得更亮或者更暗。

2.3 优点和缺点

  • 优点:更容易进行颜色识别和分割,尤其是在处理光
  • 缺点:计算上比RGB复杂,需要将RGB转换为HSV。

**

2.4. RGB 到 HSV 的转换

**

在 OpenCV 中,可以使用cv2.cvtColor()函数实现 RGB 和 HSV 之间的转换。

代码示例:RGB 到 HSV 的转换

python 复制代码
import cv2  
import numpy as np

# 读取图像  
image = cv2.imread('1.jpg')

# 转换为 HSV 颜色空间  
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
#cv2.COLOR_BGR2HSV 是一种通过指定常量来实现颜色空间转
#换的方式,能够帮助我们在图像处理中更好地处理和识别颜色。

# 定义红色的 HSV 范围  
lower_red = np.array([0, 100, 100])  # 红色的下界  
upper_red = np.array([10, 255, 255])  # 红色的上界

# 创建掩码  
mask = cv2.inRange(hsv_image, lower_red, upper_red)

# 显示结果  
cv2.imshow('Original', image)
cv2.imshow('Mask', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.5.制作掩码

  • cv2.inRange() 是 OpenCV 中用于图像处理的重要函数,主要用于创建二进制掩膜(mask),以便从输入图像中提取特定颜色范围的像素。这个函数在颜色空间转换和图像分割等应用中非常有用。

函数定义

python 复制代码
cv2.inRange(src, lowerb, upperb)

参数说明

  1. src:

    • 输入图像,通常为单通道或多通道图像(如 RGB、HSV 等)。
    • 数组类型:numpy.ndarray
  2. lowerb:

    • 指定颜色范围的下阈值,是一个表示特定颜色(如 RGB 或 HSV)的数组。
    • 例如,在 HSV 空间中,下限可表示为 [Hmin, Smin, Vmin]
    • 数组类型:numpy.ndarray ,长度应与输入图像的通道数一致。
  3. upperb:

    • 指定颜色范围的上阈值,类似于 lowerb,也是一个数组。
    • 例如,在 HSV 空间中,上限可表示为 [Hmax, Smax, Vmax]
    • 数组类型:numpy.ndarray,长度应与输入图像的通道数一致。

返回值

  • 返回值是一个二进制图像(mask),数据类型为 numpy.ndarray,与源图像同样的尺寸和通道数。
    • 所有在指定范围内的像素值将会被设为 255(白色),而不在范围内的像素值将被设为 0(黑色)。

使用示例

使用 cv2.inRange() 函数的简单示例,提取 HSV 色彩空间中特定颜色的基本过程:

python 复制代码
import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg')

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

# 定义要提取的颜色范围(以 HSV 表示)
lower_bound = np.array([100, 150, 0])  # 例如:蓝色的下限
upper_bound = np.array([140, 255, 255])  # 例如:蓝色的上限

# 创建掩膜
mask = cv2.inRange(hsv_image, lower_bound, upper_bound)

# 应用掩膜:提取原图像中的蓝色区域
result = cv2.bitwise_and(image, image, mask=mask)

# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Mask', mask)
cv2.imshow('Extracted Color', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.6.颜色------与运算

  • 颜色的与运算(AND运算)是一种像素级别的操作,通常用于图像处理中的位操作。它的作用是将两个图像中的每一个像素的颜色值进行按位与(AND)操作,得到一个新的图像。这个操作可以用于遮罩、透明处理等场景。

  • 原理说明:

    • 按位与运算:对于每个像素的颜色值,分别对红色、绿色、蓝色三个通道进行按位与运算。
    • 如果一个通道中的某一位在两个图像的对应像素中都是1,则结果图像该像素的这个通道的该位也为1,否则为0。
      举例说明:
      假设有两个图像,它们的某一像素的RGB值分别是:
python 复制代码
图像A:R = 11011011, G = 10101010, B = 11110000
图像B:R = 10101101, G = 11110000, B = 00001111

对这两个像素进行按位与运算:
结果图像:R = 10001001, G = 10100000, B = 00000000

3. HSL 颜色空间

3.1 定义

HSL(Hue, Saturation, Lightness)与HSV类似,但明度的定义不同。HSL中的亮度(Lightness)是指颜色的明暗程度,范围从0%到100%。

3.2 优缺点

优点:

缺点:在某些情况下,HSL的亮度变化可能会导致不如HSV准确的颜色表示。

**

4. Lab 颜色空间

4.1 定义

CIE实验室颜色空间基于人类视觉感知,具有较好的颜色一致性。它包含三个通道:L (亮度),a(从绿色到红色),b*(从

4.2 优点

优点:具有更好的色彩稳定性,适合进行色彩差异比较。

缺点:相对复杂,计算更为重要。

三.ROI切割

  • ROI(Region of Interest)切割是图像处理中的一种常见操作,用于从图像中提取感兴趣的区域。这个操作通常用于集中处理图像中的特定部分,节省计算资源和提高处理效率。

ROI切割的步骤:

  1. 定义ROI

    • 矩形ROI:最常见的ROI类型,定义一个矩形区域来提取。
    • 多边形ROI:定义一个任意形状的区域,通常用于更复杂的提取。
    • 圆形ROI:定义一个圆形区域。
    • 自由形状ROI:允许用户手动选择任意形状的区域。
  2. 提取区域

    • 根据定义的ROI坐标,从原始图像中提取出相应的部分。
    • 在矩形ROI的情况下,通常只需要知道矩形的起始点坐标和宽高。
  3. 处理提取区域

    • 对提取出的ROI区域进行进一步的图像处理或分析,例如特征提取、对象检测等。

示例说明:

假设你有一张包含多个物体的图像,你只对其中的一个物体感兴趣。你可以通过ROI切割操作从原始图像中提取出这个物体的部分。

步骤:
  1. 选择ROI

    • 在图像中选择一个矩形区域,包含你感兴趣的物体。
    • 确定这个矩形区域的起始坐标(x, y)和尺寸(宽度、高度)。
  2. 提取ROI

    • 从原始图像中提取这个矩形区域。
  3. 显示或处理ROI

    • 显示提取出的ROI区域,或者对其进行进一步的处理(例如边缘检测、特征识别等)。
  • 示例代码:从一张图像中提取了一个矩形区域,并显示了这个区域。
python 复制代码
import cv2

# 读取图像
image = cv2.imread('image.jpg')

# 定义ROI的坐标和大小
x, y, w, h = 100, 50, 200, 150

# 提取ROI区域
roi = image[y:y+h, x:x+w]

# 显示ROI区域
cv2.imshow('ROI', roi)
cv2.waitKey(0)
cv2.destroyAllWindows()
相关推荐
古希腊掌管学习的神1 分钟前
[机器学习]XGBoost(3)——确定树的结构
人工智能·机器学习
ZHOU_WUYI29 分钟前
4.metagpt中的软件公司智能体 (ProjectManager 角色)
人工智能·metagpt
靴子学长1 小时前
基于字节大模型的论文翻译(含免费源码)
人工智能·深度学习·nlp
AI_NEW_COME2 小时前
知识库管理系统可扩展性深度测评
人工智能
海棠AI实验室2 小时前
AI的进阶之路:从机器学习到深度学习的演变(一)
人工智能·深度学习·机器学习
hunteritself2 小时前
AI Weekly『12月16-22日』:OpenAI公布o3,谷歌发布首个推理模型,GitHub Copilot免费版上线!
人工智能·gpt·chatgpt·github·openai·copilot
IT古董3 小时前
【机器学习】机器学习的基本分类-强化学习-策略梯度(Policy Gradient,PG)
人工智能·机器学习·分类
centurysee3 小时前
【最佳实践】Anthropic:Agentic系统实践案例
人工智能
mahuifa3 小时前
混合开发环境---使用编程AI辅助开发Qt
人工智能·vscode·qt·qtcreator·编程ai
四口鲸鱼爱吃盐3 小时前
Pytorch | 从零构建GoogleNet对CIFAR10进行分类
人工智能·pytorch·分类