我正在尝试使用机器学习进行火灾探测。我的功能是平均RGB,方差RGB和Hu矩。 所以我现在正在做的是我首先根据 on this paper
分割图像根据论文,我使用规则
ALTER TABLE QAS_ASSIGNED_STATE ADD CONSTRAINT constraint_cuid UNIQUE (cuid );
这是我对负片和正像的分色结果
右侧的图片现在位于
r > g && g > b
r > 190 && g > 100 && b < 140
之后,我通过将每张图片转换为灰度并使其模糊来获得每个图片的时刻。
vector<Mat> processedImage
现在我被卡住了我不确定我的图像是否可以获得有用的时刻,因为负面图像是如此分散。 关于胡时刻提取,我是否在正确的轨道上?在提取hu时刻之前,我会在测试颜色分割的位置做同样的事情吗?
答案 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
结果:
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)
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)
这是火区:
4.最后计算你的胡时刻
for cnt in contours_retain:
print cv2.HuMoments(cv2.moments(cnt)).flatten()
我希望这有帮助!对不起,我不熟悉C ++!