1. import cv2
    2. import matplotlib.pyplot as plt
    3. import os
    4. import numpy as np
    5. # 计算方差
    6. def getss(list):
    7. # 计算平均值
    8. avg = sum(list) / len(list)
    9. # 定义方差变量ss,初值为0
    10. ss = 0
    11. # 计算方差
    12. for l in list:
    13. ss += (l - avg) * (l - avg) / len(list)
    14. # 返回方差
    15. return ss
    16. # 获取每行像素平均值
    17. def getdiff(img):
    18. # 定义边长
    19. Sidelength = 8
    20. # 缩放图像
    21. img = cv2.resize(img, (Sidelength, Sidelength), interpolation=cv2.INTER_CUBIC)
    22. # 灰度处理
    23. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    24. # avglist列表保存每行像素平均值
    25. avglist = []
    26. # 计算每行均值,保存到avglist列表
    27. for i in range(Sidelength):
    28. avg = sum(gray[i]) / len(gray[i])
    29. avglist.append(avg)
    30. # 返回avglist平均值
    31. return avglist
    32. # 读取测试图片
    33. list_name = os.listdir('photo1')
    34. for word in list_name:
    35. path = os.getcwd() + '\\photo1\\' + word
    36. # print(path)
    37. for dirpath, dirnames, filenames in os.walk(path): # 目录路径,目录名称,文件名称(全称)
    38. list = []
    39. for filename in filenames: # 遍历主文件夹下所有的文件名称,此时filename代表文件名称
    40. path = dirpath + '\\' + filename
    41. print(filename)
    42. # print(type(dirpath + '\\'+filename))
    43. # print(os.path.join(dirpath,filename))
    44. # print(filename)
    45. # img = cv2.imread(path)
    46. img = cv2.imdecode(np.fromfile(path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
    47. # img = cv2.imdecode(np.fromfile(path, dtype=np.uint8), -1)
    48. gtess = getss(getdiff(img))
    49. list.append(gtess)
    50. print(list)
    51. for i in range(len(list)):
    52. # break
    53. print('i=', i)
    54. # print('i中的list长度:', len(list))
    55. a = []
    56. for j in range(i + 1, len(list) + 1): # 此处列表的长度是实时更新的,range不会随列表元素变化进行更新变化进行实时更新
    57. if len(list) <= j:
    58. print('超出范围!!!!!!!!!!!!!!!')
    59. f=0
    60. for c in range(len(a)):
    61. b = a[c]
    62. print('b====', b)
    63. print('前list:', list)
    64. del list[b-f]
    65. f+=1
    66. print('删除后的list:', list)
    67. break
    68. elif abs(list[i] - list[j]) < 10:
    69. print('有相同的!!')
    70. # 遍历文件夹,删除方差值与列表中的方差值相同的照片
    71. # 遍历文件夹,获取其方差值
    72. for filename in filenames:
    73. print(filename)
    74. path = dirpath + '\\' + filename
    75. img = cv2.imdecode(np.fromfile(path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
    76. gtess = getss(getdiff(img))
    77. # 当检索到的图片方差值等于列表中某个方差时,删除该图片
    78. if gtess == float(list[j]):
    79. os.remove(path)
    80. filenames.remove(filename)
    81. a.append(j) # 这里是为了将已经删除目标文件的列表元素序号加入新列表中,后面进行一次删除
    82. # 若删除一次目标文件就删除一次元素,会出现元素检索时跳项的问题
    83. print('a===', a)
    84. print('删除:', path)
    85. break
    86. else:
    87. continue