基於OpenCV的火焰檢測(三) HSI顏色判據

2021-07-12 04:20:15 字數 3465 閱讀 9182

上文向大家介紹了如何用最簡單的rgb判據來初步提取火焰區域,現在我要給大家分享的是一種更加直觀的判據——hsi判據。

為什麼說hsi判據是更加直觀的判據呢?老規矩,先介紹一下hsi色彩模型:

hsi顏色模型用h、s、i三引數描述顏色特性,其中:

h表示顏色的色調,它表示人的感官對不同顏色的感受,如紅色、綠色、藍色等,它也可表示一定範圍的顏色,如暖色、冷色等。

h的單位是°,代表與紅軸的角度。

s表示顏色的飽和度,純光譜色是完全飽和的,加入白光會稀釋飽和度。飽和度越大,顏色看起來就會越鮮豔。

i對應成像亮度和影象灰度。

hsi模型的建立基於兩個重要的事實: ① i分量與影象的彩色資訊無關;② h和s分量與人感受顏色的方式是緊密相聯的。

這些特點使得hsi模型非常適合彩色特性檢測與分析。

對比一下rgb和hsi模型:

得出由rgb模型轉化為hsi模型的公式:

假設r、g、b分量已經歸一化到[0,1],那麼求出來的s分量和i分量的值也會被歸一化到[0,1]。當s分量為0的時候,對應的h分量也應該為0。

用opencv1.0可以根據上面的公式和條件寫出模型轉化函式的**:

int cvbgr2hsi(iplimage*img_bgr, iplimage*img_hsi)

if (img_bgr->nchannels != 3 || img_hsi->nchannels != 3)

double eps = 1.111e-016;

double pi = 3.1416;

double num = 0;

double den = 0;

double theta = 0;

double r, g, b, h, s, i;

for (int i = 0; i < img_bgr->height; i++)

h = h / (2 * pi);

num = min(min(r, g), b);

den = r + g + b;

if (den < eps)

s = 1 - 3 * num / den;

if (s < eps)

i = (r + g + b) / 3.0;

ptr2[3 * j + 0] = h * 360;

ptr2[3 * j + 1] = s * 255;

ptr2[3 * j + 2] = i * 255;}}

return

0;}

在**中要注意的是在opencv中rgb三通道的排列順序:先存放b分量,再存放g分量,最後才是r分量,這與matlab裡面的規則是不同的。

有了模型轉化函式之後,我們就可以在hsi色彩模型內使用hsi判據了。hsi判據很簡單,也很直觀,它的規則是每個分量設定兩個閾值,滿足

閾值條件的置1,不滿足的置0。具體表示式如下:

h_min < h < h_max and

s_min < s < s_max and

i_min < i < i_max

在opencv1.0中可以輕鬆寫出上面的**:

int cvhsi_chk(iplimage*img_hsi, iplimage*hsi_chk, int h_min, int h_max, int s_min, int s_max, int i_min, int i_max)

if (img_hsi->nchannels != 3 || hsi_chk->nchannels != 1)

cvsize size = cvgetsize(img_hsi);

iplimage*h = cvcreateimage(size, 8, 1);

iplimage*s = cvcreateimage(size, 8, 1);

iplimage*i = cvcreateimage(size, 8, 1);

iplimage*mask = cvcreateimage(size, 8, 1);

cvsplit(img_hsi, h, s, i, null);

cvcmps(h, h_min, mask, cv_cmp_ge);

cvcmps(h, h_max, h, cv_cmp_le);

cvmul(h, mask, h);

cvcmps(s, s_min, mask, cv_cmp_ge);

cvcmps(s, s_max, s, cv_cmp_le);

cvmul(s, mask, s);

cvcmps(i, i_min, mask, cv_cmp_ge);

cvcmps(i, i_max, i, cv_cmp_le);

cvmul(i, mask, i);

cvmul(h, s, h);

cvmul(h, i, hsi_chk);

cvconvertscale(hsi_chk, hsi_chk, 1.0 / 255);

cvreleaseimage(&h);

cvreleaseimage(&s);

cvreleaseimage(&i);

cvreleaseimage(&mask);

return

0;}

h_min = 0 h_max = 60

s_min = 20 s_max = 100

i_min = 100 i_max = 255

參考上面給出的色相環可以輕鬆設定h分量的兩個閾值,如果是想要檢測其他顏色的火焰,可以根據需要做修改。

s分量的閾值較小,這與火焰所處的環境有關,若是在露天較明亮的地方檢驗,則需要調低一點;若在室內較暗的地方檢驗,則需要調高一點。

i分量的閾值較大,依據這麼乙個先驗知識:火焰是會發光的。

我們可以看出,火焰的基本輪廓都提取出來了。若大家想要把整個區域都提取出來,可以自行嘗試其它閾值。

那麼我們下次見~

下文預告:基於opencv的火焰檢測(四)——rgb與hsi的結合判據

基於OpenCV的火焰檢測(二) RGB顏色判據

上文跟大家分享了在做火焰檢測中常用到的影象預處理方法,從這一篇博文開始,我將向大家介紹如何一步一步地檢測出火焰區域。火焰提取要用 到很多判據,今天我要向大家介紹的是最簡單的但是很有效的判據 rgb判據。在介紹這個判據之前,博主首先給大家簡單介紹一下rgb模型。根據三基色原理,用基色光單位來表示光的量...

樹莓派系列五 openCV之火焰檢測(一)

前言 根據 an early fire detection method based on image processing the author is thou ho chao ho chen,ping hsueh wu,and yung chuen chiou 中原理實現火焰檢測。主要結合rgb...

基於Python的OpenCV人臉檢測

注意 本文只是人臉檢測,人臉識別的實現請參見本人另一篇部落格 基於opencv tensorflow keras實現人臉識別 提前做的準備 1 和說明 import cv2 as cv import numpy as np defface detect demo 人臉檢測函式 gray cv.cvt...