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")