def Open_File(self): # 打开文件对话框并获取文件名, 只允许打开.txt文件 filename = QFileDialog.getOpenFileName(self, '选取文本文件', "./", "Text Files (*.txt)")[0] if filename != '': # 若获取的文件名不为空则执行读取操作 data = fo.Read2Array(filename, False)[0] # 将数据文件中内容以保留第一行的形式读取为矩阵 self.data = fo.Read2Array(filename, True)[0] # 将数据文件中内容以不保留第一行的形式读取为全局数据矩阵 self.pendingData = fo.Array2Str(data) # 将转换为字符串格式的矩阵数据保存进预处理变量 data = fo.Array2Str(data) # 将矩阵转换为字符串格式 self.Data.setPlainText(data) # 显示矩阵
def find_file(filename:str, file_path_list:list, FCB = {}, disk_data = [], FAT = [], now_path = ''): search_path = 'C:' temp_path = '' position = -1 target_FCB = {} ret = '' # 设置8字节全为0的列表 empty_list = bytes([0]*8) filename_list = filename.split('.') if now_path == '': now_path = search_path else: temp_path = now_path if FCB != {}: target_FCB = FCB if disk_data == []: disk_data = disk_open(search_path) # 获取FAT FAT = [] for i in range(128): FAT.append(disk_data[i]) file_FCB_bytes_list = FO.get_path_allFCB_bytes(now_path, disk_data, target_FCB, FAT) # 将文件名转换成字节型 if len(filename_list) == 1: filename_bytes = FO.filename_to_bytes(filename_list, 0) else: filename_bytes = FO.filename_to_bytes(filename_list) for i in range(len(file_FCB_bytes_list)): # 如果找到此文件 if file_FCB_bytes_list[i][0:5] == filename_bytes: position = i ret = temp_path + '/' + filename file_path_list.append(ret) for i in range(len(file_FCB_bytes_list)): # 如果找到一个文件目录 if file_FCB_bytes_list[i] != empty_list and bytes_to_FCB(file_FCB_bytes_list[i])['File_class'] == 0: position = i # 获取目标文件的字节型FCB并转换格式 target_FCB_bytes = file_FCB_bytes_list[position] target_FCB = bytes_to_FCB(target_FCB_bytes) temp_path = temp_path + '/' + str(target_FCB['File_name']).split()[0] ret = find_file(filename, file_path_list, target_FCB, disk_data, FAT, temp_path) if ret != False: break return ret
def search(img_path): cf = CaculateColorVector.get_color_feature(img_path) cfs = File_Operation.read_list_from_file('/Users/ligang/Documents/cfs.txt') distances = [] for cf_tuple in cfs: d = Distance.distance(cf, cf_tuple[1]) distances.append((cf_tuple[0], d)) top_distances = heapq.nsmallest(10, distances, key=lambda x: x[1]) print top_distances
def Fuzzy_Classification(self): threshold = self.Threshold.toPlainText() # 获取输入的分类阈值 # 判断分类阈值是否为空 if threshold == '': self.Threshold.setText('请输入分类阈值') return False result = self.fcm.Classification( float(threshold)) # 将模糊聚类矩阵对象的分类结果写入结果变量 result = fo.Classification2str(result) # 将分类结果转换为字符串格式 self.Result.setPlainText(result) # 显示分类结果 self.classfication = result # 将分类结果写入全局分类结果变量
def search(img_path): ulbp_f = ulbp.ulbp(img_path) ulbps = File_Operation.read_list_from_file('/Users/ligang/Documents/ulbp.txt') distances = [] for ulbp_tuple in ulbps: d = Distance.distance(ulbp_f, ulbp_tuple[1]) distances.append((ulbp_tuple[0], d)) top_distances = heapq.nsmallest(20, distances, key=lambda x: x[1]) dstDir = '/Users/ligang/Documents/Emilie/lbp_search_result' img_set_dir = '/Users/ligang/Documents/Emilie/dress' for top in top_distances: shutil.copy2(os.path.join(img_set_dir, top[0]), os.path.join(dstDir, top[0])) print top_distances
def Martix_Operation(self): # 执行矩阵运算前判断是否已读入数据文件 if self.data is None: self.Data.setText('请先导入文件') return False result = '' # 定义结果变量 # 建立模糊聚类矩阵对象 dist = self.Choose_Dist() operation = self.Choose_Operation() self.fcm = fc.Fuzzy_Clustering(self.data, dist, operation) # 判断是否显示并保存中间过程 if self.Process.isChecked(): result += fo.Proset2Str(self.fcm.proSet) # 对结果变量赋值并显示 result += '等价模糊矩阵:\n' + fo.Array2Str(self.fcm.efMatrix) self.Fmatrix.setPlainText(result) self.efMatrix = result # 将结果写进全局等价模糊矩阵变量 # 绘制散点图 self.figure.plotScatter(self.fcm.CutSet_Iteration()) # 执行散点图绘制函数 self.gridlayout = QGridLayout(self.MatPlot) # 重定义MatPlot部件所在位置 self.gridlayout.addWidget(self.figure, 0, 1) # 将重定义的位置替换为散点图
def search(img_path): cf = CaculateColorVector.get_color_feature(img_path) unlbp_feature = Uniform_LBP.ulbp(img_path) cfs = File_Operation.read_list_from_file('/Users/ligang/Documents/cfs.txt') ulbps = File_Operation.read_list_from_file('/Users/ligang/Documents/ulbp.txt') distances = [] for cf_tuple, ulbp_tuple in zip(cfs, ulbps): assert cf_tuple[0] == ulbp_tuple[0] d_color = Distance.distance(cf, cf_tuple[1]) d_ulbp = Distance.distance(unlbp_feature, ulbp_tuple[1]) d = d_color + d_ulbp distances.append((cf_tuple[0], d)) top_distances = heapq.nsmallest(20, distances, key=lambda x: x[1]) dstDir = '/Users/ligang/Documents/Emilie/colorlbp_search_result' img_set_dir = '/Users/ligang/Documents/Emilie/dress' for top in top_distances: shutil.copy2(os.path.join(img_set_dir, top[0]), os.path.join(dstDir, top[0])) print top_distances
def search_file_FCB(path:str, start_block:int = -1) -> list: search_path = 'C:' temp_path = '' position = -1 target_FCB = {} dir_list = [] # 设置8字节全为0的列表 empty_list = bytes([0]*8) new_path = path.split('/')[0:-1][-1] print(new_path) if start_block != -1: target_FCB = { 'File_name' : '', # 3B 'File_type' : '', # 2B 'Disk_startblock' : start_block, # 1B 0~255 'File_size' : 0, # 1B 0~255 最大存储相当4个磁盘块大小的文件 'File_class' : 0 } disk_data = disk_open(search_path) # 获取FAT FAT = [] for i in range(128): FAT.append(disk_data[i]) file_FCB_bytes_list = FO.get_path_allFCB_bytes(new_path, disk_data, target_FCB, FAT) for i in range(len(file_FCB_bytes_list)): position = i # 获取目标文件的字节型FCB并转换格式 target_FCB_bytes = file_FCB_bytes_list[position] target_FCB = bytes_to_FCB(target_FCB_bytes) dir_list.append(target_FCB) return dir_list
def get_create_position_num(filepath_list:list, disk_data, FAT = []): # 新文件起始指针 start_pointer = -1 # 设置8字节全为0的列表 empty_list = bytes([0]*8) # 在根目录下创建文件时 if len(filepath_list) == 1: root_data_list = [] # 截取磁盘第三块物理盘块中内容 root_data = disk_data[128:192] # 将根目录64B分成8块,每块8B截取到列表 for i in range(8): root_data_list.append(root_data[i*8:i*8+8]) # 在根目录中 while True: # 根目录所在的第三个盘块上最多储存8个FCB for pointer in range(9): # 当pointer指向第9个FCB时,已超出盘块下标范围,表示根目录已满,返回True if pointer == 8: return True # 根目录存在空位置 if root_data_list[pointer] == empty_list: # 获得起始位置 return pointer*8+128 #return False else: start_pointer = FO.enter_folder(filepath_list, FAT, disk_data) return start_pointer
return normalize(ulbp_feature) if __name__ == '__main__': # img_path = '/Users/ligang/Documents/Emilie/dress/85_0.jpg' # print ulbp(img_path) workDir = '/Users/ligang/Documents/Emilie/dress' startTime = time.time() count = 0 data = [] for filename in os.listdir(workDir): ulbp_feature = ulbp(os.path.join(workDir, filename)) if ulbp_feature is None: continue if len(ulbp_feature) > 0: data.append((filename, ulbp_feature)) count = count + 1 print count endTime = time.time() useTime = endTime - startTime eachTime = useTime / count print count, eachTime File_Operation.write_list_to_file('/Users/ligang/Documents/ulbp.txt', data)
def read_disk(filepath_list:list, filename_list:list, disk_data, FAT:list): position = -1 next_pointer = 1 # 文件路径中指向文件目录的指针 folder_name_list = filepath_list temp_data_list = [] temp_FCB = {} # 获取根目录下所有字节型FCB data_list = FO.get_path_allFCB_bytes(folder_name_list[next_pointer - 1], disk_data) # 如果在根目录 if next_pointer == len(folder_name_list): # 获取此目录下所有字节型FCB temp_data_list = data_list else: # 将文件名转换成字节型 filename_bytes = FO.filename_to_bytes(folder_name_list[next_pointer], 0) for i in range(8): # 如果找到此文件 if data_list[i][0:5] == filename_bytes: position = i break # 获取目标文件的字节型FCB并转换格式 FCB_bytes = data_list[position] target_FCB = bytes_to_FCB(FCB_bytes) temp_FCB = target_FCB # 获取目标文件FCB中起始盘块号 start_position = get_FCB_block_num(target_FCB) #获取当前起始盘块号 now_start_block_num = start_position # 文件目录指针指向文件路径中下一个文件目录 next_pointer = next_pointer + 1 while(next_pointer < len(folder_name_list)): data_list = [] # 获取此目录下所有字节型FCB data_list = FO.get_path_allFCB_bytes(folder_name_list[next_pointer], disk_data, temp_FCB, FAT) temp_data_list = data_list # 将文件目录名转成字节 filename_bytes = FO.filename_to_bytes(folder_name_list[next_pointer], 0) for i in range(len(data_list)): # 如果找到此文件 if data_list[i][0:5] == filename_bytes: position = i break # 获取目标文件的字节型FCB并转换格式 FCB_bytes = data_list[position] target_FCB = bytes_to_FCB(FCB_bytes) temp_FCB = target_FCB # 获取目标文件FCB中起始盘块号 start_position = get_FCB_block_num(target_FCB) #获取当前起始盘块号 now_start_block_num = start_position # 文件目录指针指向文件路径中下一个文件目录 next_pointer = next_pointer + 1 # 获取此目录下所有字节型FCB data_list = FO.get_path_allFCB_bytes(folder_name_list[next_pointer-1], disk_data, temp_FCB, FAT) temp_data_list = data_list #============================== data_list = temp_data_list ''' data_list = [] # 获取此目录下所有字节型FCB data_list = FO.get_path_allFCB_bytes(filepath_list, disk_data) ''' # 将文件名转换成字节型 filename_bytes = FO.filename_to_bytes(filename_list) for i in range(len(data_list)): # 如果找到此文件 if data_list[i][0:5] == filename_bytes: position = i break # 获取目标文件的FCB FCB_bytes = data_list[position] #print(position) target_FCB = bytes_to_FCB(FCB_bytes) #print(target_FCB) # 获取目标文件FCB中起始盘块号 start_position = get_FCB_block_num(target_FCB) # 获取文件长度 target_size = target_FCB['File_size'] # 获取文件存储所在的所有块 FAT_list = [] FAT_list.append(start_position) for i in range(start_position, 128): if FAT[i] == 129: break else: FAT_list.append(FAT[i]) connect = read_file_connect(start_position, target_size, FAT, disk_data) return connect
if __name__ == "__main__": # # cf1 = get_color_feature('/Users/ligang/170_0.jpg') # cf2 = get_color_feature('/Users/ligang/189_0.jpg') # cf3 = get_color_feature('/Users/ligang/129_0.jpg') # dis1 , dis2 = 0, 0 # for i in xrange(71): # dis1 += (cf1[i]-cf2[i]) * (cf1[i]-cf2[i]) # dis2 += (cf1[i]-cf3[i]) * (cf1[i]-cf3[i]) # print dis1, dis2 workDir = "/Users/ligang/Documents/Emilie/dress" startTime = time.time() count = 0 cfs = [] for filename in os.listdir(workDir): cf = get_color_feature(os.path.join(workDir, filename)) if len(cf) > 0: cfs.append((filename, cf)) count = count + 1 endTime = time.time() useTime = endTime - startTime print useTime, count print sys.getsizeof(cfs) File_Operation.write_list_to_file("/Users/ligang/Documents/cfs.txt", cfs)