基于经典颜色空间的火灾检测算法总结

利用火焰的颜色特征对火焰进行识别

一、本文就基于几大经典颜色特征的火灾检测算法进行了总结
几个经典的颜色空间
**
1)RGB颜色空间(适合于火灾检测)
RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,可表示大部分颜色。但在科学研究一般不采用RGB颜色空间,因为它的细节难以进行数字化的调整。
2)CMY/CMYK颜色空间(不太适合于火焰检测)
(CMY代表青色、品红色和黄色,这里主要是利用黄色的颜色空间)
CMY是工业印刷采用的颜色空间。它与RGB对应。简单的类比RGB来源于是物体发光,而CMY是依据反射光得到的。具体应用如打印机:一般采用四色墨盒,即CMY加黑色墨盒
3)HSV/ HSI/HSX颜色空间(适合于火焰分割)
HSV颜色空间是为了更好的数字化处理颜色而提出来的。有许多种HSX颜色空间,其中的X可能是V,也可能是I,依据具体使用而X含义不同。H是色调,S是饱和度,I是强度。HSB(Hue, Saturation, Brightness)颜色模型,这个颜色模型和HSL颜色模型同样都是用户台式机图形程序的颜色表示, 用六角形锥体表示自己的颜色模型
4)Lab颜色空间(未发现有人使用)
Lab颜色模型是由CIE(国际照明委员会)制定的一种色彩模式。自然界中任何一点色都可以在Lab空间中表达出来,它的色彩空间比RGB空间还要大。另外,这种模式是以数字化方式来描述人的视觉感应,与设备无关,所以它弥补了RGB和CMYK模式必须依赖于设备色彩特性的不足。由于Lab的色彩空间要比RGB模式和CMYK模式的色彩空间大。这就意味着RGB以及CMYK所能描述的色彩信息在Lab空间中都能得以影射。
6)YUV/YCbCr颜色空间(适合于火焰分割)
YUV是通过亮度-色差来描述颜色的颜色空间。亮度信号经常被称作Y,色度信号是由两个互相独立的信号组成。视颜色系统和格式不同,两种色度信号经常被称作UV或PbPr或CbCr。这些都是由不同的编码格式所产生的,但是实际上,他们的概念基本相同。在DVD中,色度信号被存储成Cb和Cr(C代表颜色,b代表蓝色,r代表红色)
二、基于以上几大颜色空间的火灾检测算法实例
处理的原图像如下:分别为图A和图B
在这里插入图片描述在这里插入图片描述
1.基于RGB的火灾检测算法
检测规则:
满足R(x,y) > 𝐺(𝑥,𝑦) > 𝐵(𝑥,𝑦)、R(x,y) > 190条件的为1(火焰),其余的为0(背景区域)
程序如下:

from PIL import Image

# Load the image
img = Image.open("422.jpg")

# Get the RGB values of each pixel
pixels = img.load()

# Loop through each pixel and check if it meets the threshold conditions
for y in range(img.height):
    for x in range(img.width):
        r, g, b = pixels[x, y]
        if r > g and g > b and r > 190:
            pixels[x, y] = (255, 255, 255)  # White
        else:
            pixels[x, y] = (0, 0, 0)  # Black

# Save the binary image
img.save("binary_image.jpg")

# Display the binary image
img.show()

执行结果:图A和图B
在这里插入图片描述
2.基于HSV的火灾检测算法
检测规则:
满足0<H<60,20<S<100,100<I<255条件的为1(火焰),其余的为0(背景区域)
程序如下:

import cv2
import numpy as np

# 读入原始图像
img = cv2.imread('422.jpg')

# 将图像从RGB空间转换为HSV空间
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 设定所需颜色的阈值上下限
lower = np.array([0, 20, 100])  # H: 0-60, S: 20-100, V: 100-255
upper = np.array([60, 100, 255])

# 根据阈值范围构建掩膜
mask = cv2.inRange(hsv_img, lower, upper)

# 显示处理结果
cv2.imshow('Binary Image', mask)
cv2.waitKey()

执行结果:图A和图B
在这里插入图片描述
3.基于YCrCb的火灾检测算法
检测规则:
满足Y(x,y)≥Cr(x,y)、𝐶𝑟(x,y)≥Cb(x,y)、Y(x,y)>𝑌通道均值、Cr(x,y)>𝐶𝑟通道均值、Cb(x,y)<𝐶𝑏通达均值条件的为1(火焰),其余的为0(背景区域)
程序如下:

import cv2
import numpy as np

img = cv2.imread('422.jpg')

# 分离出YCrCb三个通道
ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
y, cr, cb = cv2.split(ycrcb)

# 分别计算Y/Cr/Cb通道的均值
y_mean = np.mean(y)
cr_mean = np.mean(cr)
cb_mean = np.mean(cb)

# 执行二值化操作
bi_img = np.zeros((img.shape[0], img.shape[1]), np.uint8)
for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        if y[i][j] >= cr[i][j] and cr[i][j] >= cb[i][j] and y[i][j] > y_mean and cr[i][j] > cr_mean and cb[i][j] < cb_mean:
            bi_img[i][j] = 255
        else:
            bi_img[i][j] = 0

# 显示结果
cv2.imshow('binary image', bi_img)
cv2.waitKey()
cv2.destroyAllWindows()

这个程序实现了以下步骤:

  1. 载入一幅彩色图片,应用cv2模块的cvtColor函数将BGR颜色空间转换为YCrCb颜色空间,分离出Y/Cr/Cb三个通道。
  2. 计算Y/Cr/Cb通道的均值。
  3. 循环迭代每个像素,检查它是否满足二值化的条件,如果是,就将它设置为白色,否则设置为0。
  4. 显示处理后的二值化图片。
    执行结果:图A和图B在这里插入图片描述
    4.基于RGB+HSI的火灾检测算法
    检测规则:
    1.满足 R(x,y) > 𝐺(𝑥,𝑦) > 𝐵(𝑥,𝑦)、R(x,y) > 190的为1,其余的为0,得到二值化图A
    2.满足0<H<60,20<S<100,100<V<255条件的为1,其他的为0,得到二值化图B
    3.对二值化图A和B取交集得到二值化图C,展示A,B,C
    程序如下:
import cv2

# 读入彩色图像
img = cv2.imread('image.jpg')

# 分离RGB三个通道
b, g, r = cv2.split(img)

# 得到二值化图像A
A = ((r > g) & (g > b) & (r > 190)).astype('uint8') * 255

# 转换颜色空间为HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 分离H、S、V三个通道
h, s, v = cv2.split(hsv)

# 得到二值化图像B
B = cv2.inRange(hsv, (0, 20, 100), (60, 100, 255))

# 取A和B的交集得到二值化图像C
C = cv2.bitwise_and(A, B)

# 显示二值化图像A、B、C
cv2.imshow('A', A)
cv2.imshow('B', B)
cv2.imshow('C', C)
cv2.waitKey(0)
cv2.destroyAllWindows()

执行结果:图A和图B
在这里插入图片描述
5.基于RGB+YCrCb的火灾检测算法
检测规则:
1.满足 R(x,y) > 𝐺(𝑥,𝑦) > 𝐵(𝑥,𝑦)、R(x,y) > 190的为1,其余的为0,得到二值化图A
2.满足Y(x,y)≥Cr(x,y)、𝐶𝑟(x,y)≥Cb(x,y)、Y(x,y)>𝑌通道均值、Cr(x,y)>𝐶𝑟通道均值、Cb(x,y)<𝐶𝑏通道均值条件的为1,其他的为0,得到二值化图B
3.对二值化图A和B取交集得到二值化图C,展示A,B,C
程序如下:

import cv2
import numpy as np

# 读入彩色图片
img = cv2.imread("422.jpg")

# 分离R、G、B通道
b, g, r = cv2.split(img)

# 构造二值化图像A
a = np.zeros_like(r)
a[(r > g) & (g > b) & (r > 190)] = 1

# 转换为YCrCb颜色空间
ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
y, cr, cb = cv2.split(ycrcb)

# 计算通道均值
y_mean = np.mean(y)
cr_mean = np.mean(cr)
cb_mean = np.mean(cb)

# 构造二值化图像B
b = np.zeros_like(y)
b[(y >= cr) & (cr >= cb) & (y > y_mean) & (cr > cr_mean) & (cb < cb_mean)] = 1

# 取二值化图像A和B的交集C
c = a & b

# 显示结果
cv2.imshow("Result", c.astype(np.uint8)*255)
cv2.waitKey(0)
cv2.destroyAllWindows()

执行结果:图A和图B在这里插入图片描述
6.基于HSV+YCrCb的火灾检测算法
检测规则:
1.满足0<H<60,20<S<100,100<V<255条件为1,其他为0,得到二值化图B
2.满足Y(x,y)≥Cr(x,y)、𝐶𝑟(x,y)≥Cb(x,y)、Y(x,y)>𝑌通道均值、Cr(x,y)>𝐶𝑟通道均值、Cb(x,y)<𝐶𝑏通道均值条件为1,其他的0,得到二值化图B
3.对二值化图A和B取交集得到二值化图C,展示A,B,C
程序如下:

import cv2
import numpy as np

# 读取图片并将其转换为HSV颜色空间
img = cv2.imread('421.jpg')
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 提取H、S、V通道
h_channel, s_channel, v_channel = cv2.split(hsv_img)

# 取得二值化图A
a_mask = np.zeros_like(h_channel)
a_mask[(h_channel > 0) & (h_channel < 60) & (s_channel > 20) & (s_channel < 100) & (v_channel > 100) & (v_channel < 255)] = 1

# 计算Y、Cr、Cb通道均值
y_mean = np.mean(hsv_img[:,:,0])
cr_mean = np.mean(hsv_img[:,:,1])
cb_mean = np.mean(hsv_img[:,:,2])

# 取得二值化图B
b_mask = np.zeros_like(h_channel)
y_channel, cr_channel, cb_channel = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb))
b_mask[(y_channel >= cr_channel) & (cr_channel >= cb_channel) & (y_channel > y_mean) & (cr_channel > cr_mean) & (cb_channel < cb_mean)] = 1

# 取得二值化图C
c_mask = cv2.bitwise_and(a_mask, b_mask)

# 显示结果
cv2.imshow('A', a_mask*255)
cv2.imshow('B', b_mask*255)
cv2.imshow('C', c_mask*255)
cv2.waitKey(0)
cv2.destroyAllWindows()

**7.基于RGB+HSV+YCrCb的火灾检测算法**
检测规则:
1.满足R(x,y) > 𝐺(𝑥,𝑦) > 𝐵(𝑥,𝑦)、R(x,y) > 1901,其余为0,得到二值化图A
2.满足0<H<6020<S<100100<V<2551,其他为0,得到二值化图B
3.满足Y(x,y)≥Cr(x,y)、𝐶𝑟(x,y)≥Cb(x,y)、Y(x,y)>𝑌通道均值、Cr(x,y)>𝐶𝑟通道均值、Cb(x,y)<𝐶𝑏通道均值条件为1,其他的0,得到二值化图C
4.对二值化图A、B和C取交集得到二值化图D
展示A,B,C,D
程序如下:
```python
import cv2
import numpy as np

# 读取图片
img = cv2.imread('421.jpg')

# 获取每个通道的像素值
B, G, R = cv2.split(img)

# 构造颜色掩膜,满足 R(x,y) > 𝐺(𝑥,𝑦) > 𝐵(𝑥,𝑦)、R(x,y) > 190 的像素点为 1,其余的为 0
color_mask = np.logical_and(R>G, G>B)
color_mask = np.logical_and(color_mask, R>190).astype(np.uint8) * 255

# 将 RGB 图像转换为 HSV 颜色空间
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 分离颜色通道
H, S, V = cv2.split(hsv_img)

# 构造颜色控制掩膜,满足 0<H<60,20<S<100,100<V<255 的像素点为 1,其余的为 0
control_mask = (H > 0) & (H < 60) & (S > 20) & (S < 100) & (V > 100) & (V < 255)
control_mask = control_mask.astype(np.uint8) * 255

# 将 RGB 图像转换为 YCrCb 颜色空间
ycrcb_img = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)

# 分离颜色通道
Y, Cr, Cb = cv2.split(ycrcb_img)

# 求出通道均值
avg_Y = np.mean(Y)
avg_Cr = np.mean(Cr)
avg_Cb = np.mean(Cb)

# 构造 YCrCb 控制掩膜,满足 Y(x,y)≥Cr(x,y)、𝐶𝑟(x,y)≥Cb(x,y)、Y(x,y)>𝑌通道均值、Cr(x,y)>𝐶𝑟通道均值、Cb(x,y)<𝐶𝑏通道均值条件为 1,其余的为 0
ycc_mask = (Y >= Cr) & (Cr >= avg_Cr) & (Cb <= avg_Cb) & (Y > avg_Y) & (Cr > avg_Cr)
ycc_mask = ycc_mask.astype(np.uint8) * 255

# 对三个二值化图像取交集
result = cv2.bitwise_and(color_mask, control_mask)
result = cv2.bitwise_and(result, ycc_mask)

# 显示原图片和处理结果
cv2.imshow('Original Image', img)
cv2.imshow('Binary Image A', color_mask)
cv2.imshow('Binary Image B', control_mask)
cv2.imshow('Binary Image C', ycc_mask)
cv2.imshow('Binary Image D', result)
cv2.waitKey()
cv2.destroyAllWindows()

程序运行后,将在窗口中显示原图片和四个二值化图像。其中,程序的流程分为以下几个主要步骤:

  1. 读取图片,并获取每个通道的像素值。
  2. 根据颜色控制条件构造颜色掩膜,满足 R(x,y) > 𝐺(𝑥,𝑦) > 𝐵(𝑥,𝑦)、R(x,y) > 190 的像素点为 1,其余的为 0。
  3. 将 RGB 图像转换为 HSV 颜色空间,并分离出 H、S、V 三个通道。
  4. 根据颜色控制条件构造颜色控制掩膜,满足 0<H<60,20<S<100,100<V<255 的像素点为 1,其余的为 0。
  5. 将 RGB 图像转换为 YCrCb 颜色空间,并分离出 Y、Cr、Cb 三个通道。
  6. 求出通道均值。
  7. 构造 YCrCb 控制掩膜,满足 Y(x,y)≥Cr(x,y)、𝐶𝑟(x,y)≥Cb(x,y)、Y(x,y)>𝑌通道均值、Cr(x,y)>𝐶𝑟通道均值、Cb(x,y)<𝐶𝑏通道均值条件为 1,其余的为 0。
  8. 对三个掩膜进行取交集操作,得到最终的处理结果。
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值