几何矩是由Hu在1962年提出的,具有平移、旋转和尺度不变性。opencv中关于矩的计算是由C++中的Moments这个类来完成的:
//! raster image moments class CV_EXPORTS_W_MAP Moments { public: //! the default constructor Moments(); //! the full constructor Moments(double m00, double m10, double m01, double m20, double m11, double m02, double m30, double m21, double m12, double m03 ); //! the conversion from CvMoments Moments( const CvMoments& moments ); //! the conversion to CvMoments operator CvMoments() const; //! spatial moments CV_PROP_RW double m00, m10, m01, m20, m11, m02, m30, m21, m12, m03; //! central moments CV_PROP_RW double mu20, mu11, mu02, mu30, mu21, mu12, mu03; //! central normalized moments CV_PROP_RW double nu20, nu11, nu02, nu30, nu21, nu12, nu03; };
可以明显地看到它主要包括空间矩,中心矩和中心归一化矩。
一直不太相信几何矩对于植物叶片识别能够起到多大作用,尤其对于遮挡的叶片。不过刚好学习到这里,就试试在Python下计算Hu矩。
采用的图片是这前分割出来的彩色图像:
我们已经得到了它们的二值图像:
我们就以这两张二值图像做为求矩的输入图像。
# -*- coding: utf-8 -*- import cv2 import numpy as np #import matplotlib.pyplot as plt dir = ‘F:\\projects\\src\\opencv\\images\\cotton\\‘; # Hu不变矩 # 读取棉花图像 cotton = cv2.imread(dir + ‘39.mask.jpg‘) cotton = cotton[:,:,0] # 这是二值图像,仅取第一个通道 cv2.imshow(‘cotton‘, cotton) # 读取杂草图像 weed = cv2.imread(dir + ‘47.mask.jpg‘) weed = weed[:,:,0] # 这是二值图像,仅取第一个通道 cv2.imshow(‘weed‘, weed) # 计算棉花的矩和Hu矩 moments = cv2.moments(cotton) hu_moments = cv2.HuMoments(moments) print(‘cotton moments:‘) print(hu_moments) # 计算杂草的矩和Hu矩 moments = cv2.moments(weed) hu_moments = cv2.HuMoments(moments) print(‘weed moments:‘) print(hu_moments) cv2.waitKey()
得到计算结果:
仅两张图片其实说明不了什么问题,只不过通过上面的代码展示一下用Python计算Hu矩的方式,仅此而已。
原文地址:http://blog.csdn.net/lights_joy/article/details/46400811