代码人生的小狗窝

一行行枯燥的代码,却描绘出人生的点点滴滴

您现在的位置是:首页>_图形/图像

Python图像处理(九):Hu矩

发布时间:2019-12-10浏览(2388)

    Python图像处理(9):Hu矩

    快乐虾

    http://blog.csdn.net/lights_joy/

    欢迎转载,但请保留作者信息


    几何矩是由Hu1962年提出的,具有平移、旋转和尺度不变性。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矩的方式,仅此而已。