CV检测hu矩输出txt源码-DIY初稿

import cv2
import os
import numpy as np
import functools
os.getcwd()#注意有区别,转义字符//\\
np.set_printoptions(precision=5,suppress=True)#定义输出的精度
f1 = open('W:\\BD\\Netww\\huidu001//test1.txt','w')
def sys_moments(img):
    moments = cv2.moments(img)#返回的是一个字典,三阶及以下的几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)
    humoments = cv2.HuMoments(moments)#根据几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)计算出hu不变矩
    humoment = -(np.log(np.abs(humoments)))/np.log(10)
    return humoment
imgh = cv2.imread('W:\\BD\\Netww\\huidu001\\cdf (1).jpg', 0)#读取灰度图格式
arr1=sys_moments(imgh)    
# sd1=arr1.tolist()#数组转换为列表,不能打印输出
# print(sd1)
# print(int(functools.reduce(lambda x,y:str(x)+str(y), sd1)))

set_list = []
for item in range(len(arr1)):
    s=arr1[item,0]
    set_list.append(s)
    print(set_list[item])    
    f1.write(str(set_list[item])+"\n")
f1.close()

打印并输出,格式化
在这里插入图片描述
在这里插入图片描述
格式化输出:

import cv2
import os
import numpy as np
import functools
os.getcwd()#注意有区别,转义字符//\\
np.set_printoptions(precision=5,suppress=True)#定义输出的精度
f1 = open('W:\\BD\\Netww\\huidu001//test2.txt','w')
def sys_moments(img):
    moments = cv2.moments(img)#返回的是一个字典,三阶及以下的几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)
    humoments = cv2.HuMoments(moments)#根据几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)计算出hu不变矩
    humoment = -(np.log(np.abs(humoments)))/np.log(10)
    return humoment

def def_moments2(img_gray):
        row, col = img_gray.shape
        # 计算图像的0阶几何矩
        m00 = 0.0
        m10 = m01 = 0.0
        # 计算图像的二阶、三阶几何矩
        m11 = m20 = m02 = m12 = m21 = m30 = m03 = 0.0
        for i in range(row):
            for j in range(col):
                m00 += img_gray[i][j]
                m10 += i*img_gray[i][j]
                m20 += i**2*img_gray[i][j]
                m30 += i**3*img_gray[i][j]
                m11 += i * j * img_gray[i][j]
                m12 += i * j ** 2 * img_gray[i][j]
                m21 += i ** 2 * j * img_gray[i][j]
        for j in range(col):
            for i in range(row):
                m01 += (j * img_gray[i, j])
                m02 += (j ** 2 * img_gray[i, j])
                m03 += (j ** 3 * img_gray[i, j])
        # 由标准矩我们可以得到图像的"重心"
        u10 = m10 / m00
        u01 = m01 / m00
        # 计算图像的二阶中心矩、三阶中心矩
        y00 = y10 = y01 = y11 = y20 = y02 = y30 = y12 = y21 = y03 = 0.0
        for x in range(row):
            for y in range(col):
                x_ = x - u10
                y_ = y - u01
                y00 += img_gray[x][y]
                y10 += x_*img_gray[x][y]
                y01 += y_*img_gray[x][y]
                y11 += x_*y_*img_gray[x][y]
                y02 += y_**2*img_gray[x][y]
                y20 += x_**2*img_gray[x][y]
                y03 += y_**3*img_gray[x][y]
                y30 += x_**3*img_gray[x][y]
                y12 += x_*y_**2*img_gray[x][y]
                y21 += x_**2*y_*img_gray[x][y]
        # 计算图像的归一化中心矩
        n20 = y20 / (y00 ** 2)
        n02 = y02 / (y00 ** 2)
        n11 = y11 / (y00 ** 2)
        n30 = y30 / (y00 ** 2.5)
        n03 = y03 / (y00 ** 2.5)
        n12 = y12 / (y00 ** 2.5)
        n21 = y21 / (y00 ** 2.5)
        # 计算图像的七个不变矩
        h1 = n20 + n02
        h2 = (n20 - n02) ** 2 + 4 * (n11 ** 2)
        h3 = (n30 - 3 * n12) ** 2 + (3 * n21 - n03) ** 2
        h4 = (n30 + n12) ** 2 + (n21 + n03) ** 2
        h5 = (n30 - 3 * n12) * (n30 + n12) * ((n30 + n12) ** 2 - 3 * (n21 + n03) ** 2) + (3 * n21 - n03) * (n21 + n03) \
                                                                                         * (3 * (n30 + n12) ** 2 - (
            n21 + n03) ** 2)
        h6 = (n20 - n02) * ((n30 + n12) ** 2 - (n21 + n03) ** 2) + 4 * n11 * (n30 + n12) * (n21 + n03)
        h7 = (3 * n21 - n03) * (n30 + n12) * ((n30 + n12) ** 2 - 3 * (n21 + n03) ** 2) + (3 * n12 - n30) * (n21 + n03) \
                                                                                         * (3 * (n30 + n12) ** 2 - (
            n21 + n03) ** 2)
        inv_m7 = [h1, h2, h3, h4, h5, h6, h7]
        humoments = np.log(np.abs(inv_m7))
        return humoments
def main():
    input_dir = 'W:\\BD\\Netww\\huidu002\\'
    aa = os.listdir( input_dir )      
    set_list = []

    for i in aa:
        grayy=cv2.imread(input_dir+i,0)
        sys_humoments = sys_moments(grayy)
        arr1=sys_moments(grayy)   
        print('自带函数:\n',sys_humoments)  
        for item in range(len(arr1)):
                s=arr1[item,0]
                set_list.append(s)
                print(set_list[item])    
                f1.write(str(set_list[item])+"\n")  
    f1.close()        
#         def_humoments2 = def_moments2(grayy)
#         print('自定义函数2:\n',def_humoments2) 
if __name__ == '__main__':
    main()    
    print("well done")    

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
源码如下:

import cv2
import os
import numpy as np
import functools
os.getcwd()#注意有区别,转义字符//\\
np.set_printoptions(precision=5,suppress=True)#定义输出的精度
f1 = open('W:\\BD\\Netww\\huidu001//test2.txt','w')
def sys_moments(img):
    moments = cv2.moments(img)#返回的是一个字典,三阶及以下的几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)
    humoments = cv2.HuMoments(moments)#根据几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)计算出hu不变矩
    humoment = -(np.log(np.abs(humoments)))/np.log(10)
    return humoment

def def_moments2(img_gray):
        row, col = img_gray.shape
        # 计算图像的0阶几何矩
        m00 = 0.0
        m10 = m01 = 0.0
        # 计算图像的二阶、三阶几何矩
        m11 = m20 = m02 = m12 = m21 = m30 = m03 = 0.0
        for i in range(row):
            for j in range(col):
                m00 += img_gray[i][j]
                m10 += i*img_gray[i][j]
                m20 += i**2*img_gray[i][j]
                m30 += i**3*img_gray[i][j]
                m11 += i * j * img_gray[i][j]
                m12 += i * j ** 2 * img_gray[i][j]
                m21 += i ** 2 * j * img_gray[i][j]
        for j in range(col):
            for i in range(row):
                m01 += (j * img_gray[i, j])
                m02 += (j ** 2 * img_gray[i, j])
                m03 += (j ** 3 * img_gray[i, j])
        # 由标准矩我们可以得到图像的"重心"
        u10 = m10 / m00
        u01 = m01 / m00
        # 计算图像的二阶中心矩、三阶中心矩
        y00 = y10 = y01 = y11 = y20 = y02 = y30 = y12 = y21 = y03 = 0.0
        for x in range(row):
            for y in range(col):
                x_ = x - u10
                y_ = y - u01
                y00 += img_gray[x][y]
                y10 += x_*img_gray[x][y]
                y01 += y_*img_gray[x][y]
                y11 += x_*y_*img_gray[x][y]
                y02 += y_**2*img_gray[x][y]
                y20 += x_**2*img_gray[x][y]
                y03 += y_**3*img_gray[x][y]
                y30 += x_**3*img_gray[x][y]
                y12 += x_*y_**2*img_gray[x][y]
                y21 += x_**2*y_*img_gray[x][y]
        # 计算图像的归一化中心矩
        n20 = y20 / (y00 ** 2)
        n02 = y02 / (y00 ** 2)
        n11 = y11 / (y00 ** 2)
        n30 = y30 / (y00 ** 2.5)
        n03 = y03 / (y00 ** 2.5)
        n12 = y12 / (y00 ** 2.5)
        n21 = y21 / (y00 ** 2.5)
        # 计算图像的七个不变矩
        h1 = n20 + n02
        h2 = (n20 - n02) ** 2 + 4 * (n11 ** 2)
        h3 = (n30 - 3 * n12) ** 2 + (3 * n21 - n03) ** 2
        h4 = (n30 + n12) ** 2 + (n21 + n03) ** 2
        h5 = (n30 - 3 * n12) * (n30 + n12) * ((n30 + n12) ** 2 - 3 * (n21 + n03) ** 2) + (3 * n21 - n03) * (n21 + n03) \
                                                                                         * (3 * (n30 + n12) ** 2 - (
            n21 + n03) ** 2)
        h6 = (n20 - n02) * ((n30 + n12) ** 2 - (n21 + n03) ** 2) + 4 * n11 * (n30 + n12) * (n21 + n03)
        h7 = (3 * n21 - n03) * (n30 + n12) * ((n30 + n12) ** 2 - 3 * (n21 + n03) ** 2) + (3 * n12 - n30) * (n21 + n03) \
                                                                                         * (3 * (n30 + n12) ** 2 - (
            n21 + n03) ** 2)
        inv_m7 = [h1, h2, h3, h4, h5, h6, h7]
        humoments = np.log(np.abs(inv_m7))
        return humoments
def main():
    input_dir = 'W:\\BD\\Netww\\huidu002\\'
    aa = os.listdir( input_dir )      
    set_list = []

    for i in aa:
        grayy=cv2.imread(input_dir+i,0)
        sys_humoments = sys_moments(grayy)
        arr1=sys_moments(grayy)   
        print('自带函数:\n',sys_humoments)  
        for item in range(len(arr1)):
                s=arr1[item,0]
                set_list.append(s)
                print(set_list[item])    
                f1.write("hu矩"+str(item+1)+"\t"+str(set_list[item])+"\n")  
    f1.close()        
#         def_humoments2 = def_moments2(grayy)
#         print('自定义函数2:\n',def_humoments2) 
if __name__ == '__main__':
    main()    
    print("well done")    

升级版效果

import cv2
import os
import numpy as np
import functools

def sys_moments(img):
    moments = cv2.moments(img)#返回的是一个字典,三阶及以下的几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)
    humoments = cv2.HuMoments(moments)#根据几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)计算出hu不变矩
    humoment = -(np.log(np.abs(humoments)))/np.log(10)
    return humoment

def def_moments2(img_gray):
        row, col = img_gray.shape
        # 计算图像的0阶几何矩
        m00 = 0.0
        m10 = m01 = 0.0
        # 计算图像的二阶、三阶几何矩
        m11 = m20 = m02 = m12 = m21 = m30 = m03 = 0.0
        for i in range(row):
            for j in range(col):
                m00 += img_gray[i][j]
                m10 += i*img_gray[i][j]
                m20 += i**2*img_gray[i][j]
                m30 += i**3*img_gray[i][j]
                m11 += i * j * img_gray[i][j]
                m12 += i * j ** 2 * img_gray[i][j]
                m21 += i ** 2 * j * img_gray[i][j]
        for j in range(col):
            for i in range(row):
                m01 += (j * img_gray[i, j])
                m02 += (j ** 2 * img_gray[i, j])
                m03 += (j ** 3 * img_gray[i, j])
        # 由标准矩我们可以得到图像的"重心"
        u10 = m10 / m00
        u01 = m01 / m00
        # 计算图像的二阶中心矩、三阶中心矩
        y00 = y10 = y01 = y11 = y20 = y02 = y30 = y12 = y21 = y03 = 0.0
        for x in range(row):
            for y in range(col):
                x_ = x - u10
                y_ = y - u01
                y00 += img_gray[x][y]
                y10 += x_*img_gray[x][y]
                y01 += y_*img_gray[x][y]
                y11 += x_*y_*img_gray[x][y]
                y02 += y_**2*img_gray[x][y]
                y20 += x_**2*img_gray[x][y]
                y03 += y_**3*img_gray[x][y]
                y30 += x_**3*img_gray[x][y]
                y12 += x_*y_**2*img_gray[x][y]
                y21 += x_**2*y_*img_gray[x][y]
        # 计算图像的归一化中心矩
        n20 = y20 / (y00 ** 2)
        n02 = y02 / (y00 ** 2)
        n11 = y11 / (y00 ** 2)
        n30 = y30 / (y00 ** 2.5)
        n03 = y03 / (y00 ** 2.5)
        n12 = y12 / (y00 ** 2.5)
        n21 = y21 / (y00 ** 2.5)
        # 计算图像的七个不变矩
        h1 = n20 + n02
        h2 = (n20 - n02) ** 2 + 4 * (n11 ** 2)
        h3 = (n30 - 3 * n12) ** 2 + (3 * n21 - n03) ** 2
        h4 = (n30 + n12) ** 2 + (n21 + n03) ** 2
        h5 = (n30 - 3 * n12) * (n30 + n12) * ((n30 + n12) ** 2 - 3 * (n21 + n03) ** 2) + (3 * n21 - n03) * (n21 + n03) \
                                                                                         * (3 * (n30 + n12) ** 2 - (
            n21 + n03) ** 2)
        h6 = (n20 - n02) * ((n30 + n12) ** 2 - (n21 + n03) ** 2) + 4 * n11 * (n30 + n12) * (n21 + n03)
        h7 = (3 * n21 - n03) * (n30 + n12) * ((n30 + n12) ** 2 - 3 * (n21 + n03) ** 2) + (3 * n12 - n30) * (n21 + n03) \
                                                                                         * (3 * (n30 + n12) ** 2 - (
            n21 + n03) ** 2)
        inv_m7 = [h1, h2, h3, h4, h5, h6, h7]
        humoments = np.log(np.abs(inv_m7))
        return humoments
      
def main2():
    input_dir = 'W:\\BD\\Netww\\huidu002\\'
    aa = os.listdir( input_dir )
    for i in aa:
        grayy=cv2.imread(input_dir+i,0)
        sys_humoments = sys_moments(grayy)
#         def_humoments = def_moments(grayy)
        def_humoments2 = def_moments2(grayy)
        print('自带函数:\n',sys_humoments)
#         print('自定义函数:\n',def_humoments) 
        print('自定义函数2:\n',def_humoments2) 
def main():
    f1 = open("S:\\AdobeppPS\\ceshi01.txt",'w+')
    input_dir = "S:\\AdobeppPS\\SKOO\\"
    aa = os.listdir( input_dir) 
    abc=0
    set_list = []
    list00=[]
    for ia in aa:
        grayy=cv2.imread(input_dir+ia,0)
        sys_humoments0 = sys_moments(grayy)
        arr1=sys_moments(grayy)  
        abc=abc+1
        print("第 "+str(abc)+"张图片自带函数测试数据:")
#         print(sys_humoments0)
        for item in range(len(arr1)):
            s=arr1[item,0]
            set_list.append(s)
            list00.append(s)
#             print("\t",format(set_list[item],".3f"))             
            f1.write("第 "+str(abc)+"张图片:"+str(format(set_list[item],".4f"))+"\n")
#         f1.write("第 "+str(abc)+"张图片:"+str(format(set_list[item],".4f"))+"\n") 
    for cs in range(len(aa)):
        print("\n",format(list00[cs],".3f")) 
    f1.close()    
if __name__ == '__main__':
    main()   
 #         print("第 "+str(abc)+"张图片自带函数测试数据:")
#         print(sys_humoments0)
#         print(arr1[2,0])#输出二阶矩,一维向量
    print("well done")    

注意这里的hu矩是进行了转换后的数据结果
在这里插入图片描述
最终版,自定义函数是一维数组,有bug,而且运行迟钝,借助强悍的数据分析,缺乏很大的改进机制。

import cv2
import os
import numpy as np
import functools

def sys_moments(img):
    moments = cv2.moments(img)#返回的是一个字典,三阶及以下的几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)
    humoments = cv2.HuMoments(moments)#根据几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)计算出hu不变矩
    humoment = -(np.log(np.abs(humoments)))/np.log(10)
    return humoment

def def_moments2(img_gray):
        row, col = img_gray.shape
        # 计算图像的0阶几何矩
        m00 = 0.0
        m10 = m01 = 0.0
        # 计算图像的二阶、三阶几何矩
        m11 = m20 = m02 = m12 = m21 = m30 = m03 = 0.0
        for i in range(row):
            for j in range(col):
                m00 += img_gray[i][j]
                m10 += i*img_gray[i][j]
                m20 += i**2*img_gray[i][j]
                m30 += i**3*img_gray[i][j]
                m11 += i * j * img_gray[i][j]
                m12 += i * j ** 2 * img_gray[i][j]
                m21 += i ** 2 * j * img_gray[i][j]
        for j in range(col):
            for i in range(row):
                m01 += (j * img_gray[i, j])
                m02 += (j ** 2 * img_gray[i, j])
                m03 += (j ** 3 * img_gray[i, j])
        # 由标准矩我们可以得到图像的"重心"
        u10 = m10 / m00
        u01 = m01 / m00
        # 计算图像的二阶中心矩、三阶中心矩
        y00 = y10 = y01 = y11 = y20 = y02 = y30 = y12 = y21 = y03 = 0.0
        for x in range(row):
            for y in range(col):
                x_ = x - u10
                y_ = y - u01
                y00 += img_gray[x][y]
                y10 += x_*img_gray[x][y]
                y01 += y_*img_gray[x][y]
                y11 += x_*y_*img_gray[x][y]
                y02 += y_**2*img_gray[x][y]
                y20 += x_**2*img_gray[x][y]
                y03 += y_**3*img_gray[x][y]
                y30 += x_**3*img_gray[x][y]
                y12 += x_*y_**2*img_gray[x][y]
                y21 += x_**2*y_*img_gray[x][y]
        # 计算图像的归一化中心矩
        n20 = y20 / (y00 ** 2)
        n02 = y02 / (y00 ** 2)
        n11 = y11 / (y00 ** 2)
        n30 = y30 / (y00 ** 2.5)
        n03 = y03 / (y00 ** 2.5)
        n12 = y12 / (y00 ** 2.5)
        n21 = y21 / (y00 ** 2.5)
        # 计算图像的七个不变矩
        h1 = n20 + n02
        h2 = (n20 - n02) ** 2 + 4 * (n11 ** 2)
        h3 = (n30 - 3 * n12) ** 2 + (3 * n21 - n03) ** 2
        h4 = (n30 + n12) ** 2 + (n21 + n03) ** 2
        h5 = (n30 - 3 * n12) * (n30 + n12) * ((n30 + n12) ** 2 - 3 * (n21 + n03) ** 2) + (3 * n21 - n03) * (n21 + n03) \
                                                                                         * (3 * (n30 + n12) ** 2 - (n21 + n03) ** 2)
        h6 = (n20 - n02) * ((n30 + n12) ** 2 - (n21 + n03) ** 2) + 4 * n11 * (n30 + n12) * (n21 + n03)
        h7 = (3 * n21 - n03) * (n30 + n12) * ((n30 + n12) ** 2 - 3 * (n21 + n03) ** 2) + (3 * n12 - n30) * (n21 + n03) \
                                                                                         * (3 * (n30 + n12) ** 2 - (n21 + n03) ** 2)
        inv_m7 = [h1, h2, h3, h4, h5, h6, h7]
        humoments = np.log(np.abs(inv_m7))
        return humoments
      
def main2():
    input_dir = 'W:\\BD\\Netww\\huidu002\\'
    aa = os.listdir( input_dir )
    for i in aa:
        grayy=cv2.imread(input_dir+i,0)
        sys_humoments = sys_moments(grayy)
#         def_humoments = def_moments(grayy)
#         def_humoments2 = def_moments2(grayy)
        print('自带函数:\n',sys_humoments)
        print('自定义函数2:\n',def_humoments2) 
def main():
    f1 = open("S:\\AdobeppPS\\ceshi01.txt",'w+')
    input_dir = "S:\\AdobeppPS\\SKOO\\"
    aa = os.listdir( input_dir) 
    abc=0
    set_list = []
    list00=[]
    zs=len(aa)*7
    for ia in aa:
        grayy=cv2.imread(input_dir+ia,0)
#         arr1=def_moments2(grayy)
        arr1=sys_moments(grayy)  
#         print(type(arr1))
        for item in range(len(arr1)):
            s=arr1[item,0]
            set_list.append(s)
            list00.append(s)
    for cs0 in range(zs):
        if cs0%7==0:
            abc=abc+1
#             f1.write("第 "+str(abc)+"张图片:")
        f1.write("第 "+str(abc)+"张图片:\t"+str(format(list00[cs0],".3f"))+"\n")
    f1.close()    
if __name__ == '__main__':
    main()   
    print("well done")    

精简版:

import cv2
import os
import numpy as np
import functools

def sys_moments(img):
    moments = cv2.moments(img)#返回的是一个字典,三阶及以下的几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)
    humoments = cv2.HuMoments(moments)#根据几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)计算出hu不变矩
    humoment = -(np.log(np.abs(humoments)))/np.log(10)
    return humoment

def main():
    f1 = open("S:\\AdobeppPS\\ceshi01.txt",'w+')
    input_dir = "S:\\AdobeppPS\\SKOO\\"
    aa = os.listdir( input_dir) 
    abc=0
    set_list = []
    list00=[]
    zs=len(aa)*7
    for ia in aa:
        grayy=cv2.imread(input_dir+ia,0)
#         arr1=def_moments2(grayy)
        arr1=sys_moments(grayy)  
#         print(type(arr1))
        for item in range(len(arr1)):
            s=arr1[item,0]
            set_list.append(s)
            list00.append(s)
    for cs0 in range(zs):
        if cs0%7==0:
            abc=abc+1
        f1.write("第 "+str(abc)+"张图片:\t"+str(format(list00[cs0],".3f"))+"\n")
    f1.close()    
if __name__ == '__main__':
    main()   
    print("well done")    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海宝7号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值