OpenCV Hu瞬间提取

时间:2016-03-16 08:31:29

标签: opencv computer-vision feature-extraction

我正在尝试使用机器学习进行火灾探测。我的功能是平均RGB,方差RGB和Hu矩。 所以我现在正在做的是我首先根据 on this paper

分割图像

根据论文,我使用规则

ALTER TABLE QAS_ASSIGNED_STATE ADD CONSTRAINT constraint_cuid  UNIQUE (cuid );

这是我对负片和正像的分色结果

1 2 3 4 5 6

右侧的图片现在位于

r > g && g > b
r > 190 && g > 100 && b < 140

之后,我通过将每张图片转换为灰度并使其模糊来获得每个图片的时刻。

vector<Mat> processedImage

现在我被卡住了我不确定我的图像是否可以获得有用的时刻,因为负面图像是如此分散。 关于胡时刻提取,我是否在正确的轨道上?在提取hu时刻之前,我会在测试颜色分割的位置做同样的事情吗?

1 个答案:

答案 0 :(得分:3)

我认为你应该遵循这些步骤(Python中的代码):

1.通过迭代原始图像来创建二进制图像。如果一个像素被识别为火将变为白色而不是黑色(如果你使用的是BRG或RGB,请小心。在BRG中OpenCV读取图像,所以你需要先转换):

rows,cols = im2.shape[:2]
for i in xrange(rows):
    for j in xrange(cols):
    if im2[i,j,0]>im2[i,j,1] and im2[i,j,1]>im2[i,j,2] and im2[i,j,0]>190 and im2[i,j,1] > 100 and im2[i,j,2] <140:
        im2[i,j,:]=255
    else:
        im2[i,j,:]=0

结果:

enter image description here

2.使用形态学算子和模糊来减少噪音/小轮廓。

# Convert to greyscale-monochromatic
gray = cv2.cvtColor(im2,cv2.COLOR_RGB2GRAY) 
#Apply Gaussian Blur 
blur= cv2.GaussianBlur(gray,(7,7),0)

# Threshold again since after gaussian blur the image is no longer binary
(thresh, bw_image) = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY| cv2.THRESH_OTSU) 
# Difine Kernel Size and apply erosion filter
element = cv2.getStructuringElement(cv2.MORPH_RECT,(7,7))  
dilated=cv2.dilate(bw_image,element) 
eroded=cv2.erode(dilated,element) 

enter image description here

3.之后,您可以使用cv2.RETR_EXTERNAL标志检测轮廓,这样您就可以忽略所有内部轮廓(您只对火区的外轮廓感兴趣)。此外,您只能保留大于例如大小的轮廓。 500px或者如果你知道只有一个&#34;火&#34;就选择更大的一个。

 g, contours,hierarchy = cv2.findContours(eroded,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

contours_retain=[]
for cnt in contours:
    if  cv2.contourArea(cnt)>500: 
        contours_retain.append(cnt)

cv2.drawContours(im_cp,contours_retain,-1,(255,0,255),3)

这是火区:

enter image description here

4.最后计算你的胡时刻

 for cnt in contours_retain:
    print cv2.HuMoments(cv2.moments(cnt)).flatten()

我希望这有帮助!对不起,我不熟悉C ++!