一.多种形态学
- 形态学变换(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)
。
- shape: 形状类型,包括:
1.1. cv2.MORPH_RECT
cv2.MORPH_RECT
代表矩形结构元素。它是一个矩形的内核,可以用于执行基本的形态学操作,例如膨胀、腐蚀、开运算和闭运算。
- 用途:矩形结构元素常用于处理具有显然水平和垂直特征的图像,比如文本和边框。
- 创建方式:可以通过
cv2.getStructuringElement(cv2.MORPH_RECT, (宽度, 高度))
来创建。
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, (宽度, 高度))
来创建。
# 创建一个5x5的椭圆形结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
1.3. cv2.MORPH_CROSS
cv2.MORPH_CROSS
代表十字形结构元素。它包含一个十字形的内核动作。
- 用途:十字符合某些特定应用的要求,例如保留图像中直线的结构,或者细化边缘。
- 创建方式:可以通过
cv2.getStructuringElement(cv2.MORPH_CROSS, (宽度, 高度))
来创建。
# 创建一个5x5的十字形结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
- 结构元素在形态学操作中起着重要作用,选择合适的形状和大小可以有效地影响图像处理的结果。通过适当的结构元素组合,您可以实现不同的图像分析和预处理效果。
2. 腐蚀(侵蚀)
- 原理:腐蚀操作通过一个结构元素在图像上滑动,检查结构元素与图像的重叠区域。如果结构元素的每个白色像素都对应于图像中的白色像素,则中心像素被保留;否则,该像素被保留腐蚀为黑色。这样的操作使得视线的边界向内收缩。
函数:cv2.erode(image, kernel, iterations=1) |
---|
- kernel:结构元素,用于确定腐蚀操作的形状和大小。可以使用cv2.getStructuringElement创建。
- iterations:执行腐蚀操作的次数。值越大,腐蚀效果越明显。
示例:
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:执行膨胀操作的次数。值越大,膨胀效果越明显。
示例:
kernel = np.ones((5, 5), np.uint8) # 5x5的矩形结构元素
dilated = cv2.dilate(image, kernel, iterations=1)
**
4. 开运算(Opening)
**
- 原理:开运算是先进行腐蚀再进行膨胀。它主要用于去除较小的噪声和物体,同时保留更大的物体的形状和尺寸。开腐蚀有效地去除较小的物体和较细的噪声。(先取小,再取大)
cv2.morphologyEx(src, op, kernel, iterations=1)
- src: 输入图像。
- op: 运算类型,这里是
cv2.MORPH_OPEN
。 - kernel: 结构元素,定义开运算的形状和大小。
- iterations: 迭代次数,指定开运算的重复次数。默认为1。
示例:
kernel = np.ones((5, 5), np.uint8) # 5x5的矩形结构元素
opened = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
5. 闭运算 (Closing)
- 闭运算是先进行膨胀后进行腐蚀的操作,主要用于修整小空洞,连接相邻的工件。(先取大再取小)
cv2.morphologyEx(src, op, kernel, iterations=1)
- src: 输入图像。
- op: 运算类型,这里是
cv2.MORPH_CLOSE
。 - kernel: 结构元素,定义闭运算的形状和大小。
- iterations: 迭代次数,指定闭运算的重复次数。默认为1。
# 执行闭运算
closed = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
# 显示结果
cv2.imshow('Closed', closed)
cv2.waitKey(0)
cv2.destroyAllWindows()
6. 礼帽运算 (Top Hat)
- 礼帽运算是通过计算闭运算和开运算的差值来获得的,主要用于去除图像的边缘。(先取大再取小)–(先取小,再取大)
cv2.morphologyEx(src, op, kernel, iterations=1)
- src: 输入图像。
- op: 运算类型,这里是
cv2.MORPH_TOPHAT
。 - kernel: 结构元素,定义操作的形状和大小。
- iterations: 迭代次数,指定礼帽运算的重复次数。默认为1。
# 执行闭运算和开运算
top_hat = cv2.morphologyEx(image, cv2.MORPH_TOPHAT, kernel)
# 显示结果
cv2.imshow('Top Hat', top_hat)
cv2.waitKey(0)
cv2.destroyAllWindows()
7. 黑帽运算 (Black Hat)
- 黑帽运算是通过计算原始图像与隐藏损伤结果之间的差值来获得的,主要用于提取图像中的暗区域。
cv2.morphologyEx(src, op, kernel, iterations=1)
- src: 输入图像。
- op: 运算类型,这里是
cv2.MORPH_BLACKHAT
。 - kernel: 结构元素,定义操作的形状和大小。
- iterations: 迭代次数,指定黑帽运算的重复次数。默认为1。
# 执行黑帽运算
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算子)更粗一些,因为它是通过结构元素对物体进行膨胀和腐蚀的差异得到的。
- 它通常用于前景和背景分离、边缘检测等图像分析任务
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添加是模运算
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 的转换
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),以便从输入图像中提取特定颜色范围的像素。这个函数在颜色空间转换和图像分割等应用中非常有用。
函数定义
cv2.inRange(src, lowerb, upperb)
参数说明
-
src:
- 输入图像,通常为单通道或多通道图像(如 RGB、HSV 等)。
- 数组类型:
numpy.ndarray
-
lowerb:
- 指定颜色范围的下阈值,是一个表示特定颜色(如 RGB 或 HSV)的数组。
- 例如,在 HSV 空间中,下限可表示为
[Hmin, Smin, Vmin]
。 - 数组类型:
numpy.ndarray
,长度应与输入图像的通道数一致。
-
upperb:
- 指定颜色范围的上阈值,类似于
lowerb
,也是一个数组。 - 例如,在 HSV 空间中,上限可表示为
[Hmax, Smax, Vmax]
。 - 数组类型:
numpy.ndarray
,长度应与输入图像的通道数一致。
- 指定颜色范围的上阈值,类似于
返回值
- 返回值是一个二进制图像(mask),数据类型为
numpy.ndarray
,与源图像同样的尺寸和通道数。- 所有在指定范围内的像素值将会被设为 255(白色),而不在范围内的像素值将被设为 0(黑色)。
使用示例
使用 cv2.inRange()
函数的简单示例,提取 HSV 色彩空间中特定颜色的基本过程:
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值分别是:
图像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切割的步骤:
-
定义ROI:
- 矩形ROI:最常见的ROI类型,定义一个矩形区域来提取。
- 多边形ROI:定义一个任意形状的区域,通常用于更复杂的提取。
- 圆形ROI:定义一个圆形区域。
- 自由形状ROI:允许用户手动选择任意形状的区域。
-
提取区域:
- 根据定义的ROI坐标,从原始图像中提取出相应的部分。
- 在矩形ROI的情况下,通常只需要知道矩形的起始点坐标和宽高。
-
处理提取区域:
- 对提取出的ROI区域进行进一步的图像处理或分析,例如特征提取、对象检测等。
示例说明:
假设你有一张包含多个物体的图像,你只对其中的一个物体感兴趣。你可以通过ROI切割操作从原始图像中提取出这个物体的部分。
步骤:
-
选择ROI:
- 在图像中选择一个矩形区域,包含你感兴趣的物体。
- 确定这个矩形区域的起始坐标(x, y)和尺寸(宽度、高度)。
-
提取ROI:
- 从原始图像中提取这个矩形区域。
-
显示或处理ROI:
- 显示提取出的ROI区域,或者对其进行进一步的处理(例如边缘检测、特征识别等)。
- 示例代码:从一张图像中提取了一个矩形区域,并显示了这个区域。
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()
标签:kernel,颜色,运算,image,cv2,OpenCV,图像,操作,图片
From: https://blog.csdn.net/alb3117149013/article/details/141167236