OpenCV 胡矩提取
OpenCV Hu moments extraction
我正在尝试使用机器学习进行火灾探测。我的特征是均值 RGB、方差 RGB 和 Hu 矩。
所以我现在正在做的是首先根据 on this paper
分割图像
按照论文我使用的规则
r > g && g > b
r > 190 && g > 100 && b < 140
这是我对正负图像进行颜色分割的结果
右边的图片现在在
vector<Mat> processedImage
之后我通过将其转换为灰度并对其进行模糊来获得每张图片的hu时刻。
cvtColor(processedImage[x], gray_image, CV_BGR2GRAY);
blur(gray_image, gray_image, Size(3, 3));
Canny(gray_image, canny_output, thresh, thresh * 2, 3);
findContours(canny_output, contours, hierarchy, CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
cv::Moments mom = cv::moments(contours[0]);
cv::HuMoments(mom, hu); // now in hu are your 7 Hu-Moments
现在我卡住了我不确定我的图像是否可以获取有用的 hu 时刻,因为负片图像太分散了。
关于 Hu 矩提取,我是否走在正确的轨道上?在提取 hu 矩之前,我会在测试我在哪里进行颜色分割时做同样的事情吗?
我认为你应该遵循以下步骤(Python 中的代码):
1.Create 通过迭代原始图像得到一个二值图像。如果一个像素被识别为火将变为白色,否则变为黑色(如果您使用 BRG 或 RGB 请小心。OpenCV 读取 BRG 中的图像,因此您需要先转换):
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.Use 形态学运算符和模糊以减少 noise/small 轮廓。
# 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.Afterwards,您可以使用cv2.RETR_EXTERNAL标志检测轮廓,因此您可以忽略所有内部轮廓(您只对火灾区域的外部轮廓感兴趣)。您也可以只保留比例如大的轮廓。 500 像素,如果您知道只有一个 "fire".
,则只选择较大的那个
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.Finally计算你的胡矩
for cnt in contours_retain:
print cv2.HuMoments(cv2.moments(cnt)).flatten()
希望对您有所帮助!抱歉我对C++不熟悉!
我正在尝试使用机器学习进行火灾探测。我的特征是均值 RGB、方差 RGB 和 Hu 矩。 所以我现在正在做的是首先根据 on this paper
分割图像按照论文我使用的规则
r > g && g > b
r > 190 && g > 100 && b < 140
这是我对正负图像进行颜色分割的结果
右边的图片现在在
vector<Mat> processedImage
之后我通过将其转换为灰度并对其进行模糊来获得每张图片的hu时刻。
cvtColor(processedImage[x], gray_image, CV_BGR2GRAY);
blur(gray_image, gray_image, Size(3, 3));
Canny(gray_image, canny_output, thresh, thresh * 2, 3);
findContours(canny_output, contours, hierarchy, CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
cv::Moments mom = cv::moments(contours[0]);
cv::HuMoments(mom, hu); // now in hu are your 7 Hu-Moments
现在我卡住了我不确定我的图像是否可以获取有用的 hu 时刻,因为负片图像太分散了。 关于 Hu 矩提取,我是否走在正确的轨道上?在提取 hu 矩之前,我会在测试我在哪里进行颜色分割时做同样的事情吗?
我认为你应该遵循以下步骤(Python 中的代码):
1.Create 通过迭代原始图像得到一个二值图像。如果一个像素被识别为火将变为白色,否则变为黑色(如果您使用 BRG 或 RGB 请小心。OpenCV 读取 BRG 中的图像,因此您需要先转换):
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.Use 形态学运算符和模糊以减少 noise/small 轮廓。
# 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.Afterwards,您可以使用cv2.RETR_EXTERNAL标志检测轮廓,因此您可以忽略所有内部轮廓(您只对火灾区域的外部轮廓感兴趣)。您也可以只保留比例如大的轮廓。 500 像素,如果您知道只有一个 "fire".
,则只选择较大的那个 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.Finally计算你的胡矩
for cnt in contours_retain:
print cv2.HuMoments(cv2.moments(cnt)).flatten()
希望对您有所帮助!抱歉我对C++不熟悉!