无原图信息的网格分割乱序图像拼接算法优化求助
网格分割乱序图像还原算法优化求助
我花了一周开发了一款应用,目标是将被分割为x行y列并打乱的图像还原到原始状态,且无原图信息可用。查资料后发现,现有方案大多针对带边缘形状的拼图,而非这类规则网格分割的图像。
最初我尝试用遗传算法解决,但适配的适应度函数效果很差,导致耗时不稳定、还原结果不一致,于是改用基于边缘检测的适应度匹配方案:通过计算图像块边缘的匹配度来拼接还原图像,但当前算法成功率仅约20%。

核心代码(获取初始适应度值)
def get_piece_fitness(self): # checks how likely each piece is to be next to each other for piece_one in self.image_pieces: Helper.get_certain_loading(current_progress=piece_one.index + 1, final_num=len(self.image_pieces), description="Getting fitness values of piece edges: ") right_edge_fit_likelihood = [] left_edge_fit_likelihood = [] top_edge_fit_likelihood = [] bottom_edge_fit_likelihood = [] for piece_two in self.image_pieces: if piece_two != piece_one: # check whether the pieces aren't the same piece # concatenating horizontally on both sides at once to save on computing power horizontal_edge_fit = np.concatenate( [piece_two.gray_piece, piece_one.gray_piece, piece_two.gray_piece], axis=1) horizontal_edge_likelihood = self.get_edge_fitness(horizontal_edge_fit, is_horizontal=True) left_edge_fit_likelihood.append((piece_two, horizontal_edge_likelihood[0])) right_edge_fit_likelihood.append((piece_two, horizontal_edge_likelihood[1])) vertical_edge_fit = np.concatenate( [piece_two.gray_piece, piece_one.gray_piece, piece_two.gray_piece]) vertical_edge_likelihood = self.get_edge_fitness(vertical_edge_fit, is_horizontal=False) top_edge_fit_likelihood.append((piece_two, vertical_edge_likelihood[0])) bottom_edge_fit_likelihood.append((piece_two, vertical_edge_likelihood[1])) piece_one.left_edge_candidates = left_edge_fit_likelihood piece_one.right_edge_candidates = right_edge_fit_likelihood piece_one.bottom_edge_candidates = bottom_edge_fit_likelihood piece_one.top_edge_candidates = top_edge_fit_likelihood def get_edge_fitness(self, image: np.ndarray, is_horizontal: bool) -> tuple[float, float]: image_blur = cv.GaussianBlur(image, (5, 5), 0) # image blur edges = cv.Canny(image=image_blur, threshold1=30, threshold2=self.contrast) # Canny Edge Detection if is_horizontal: edges_width = edges.shape[1] left_edge = np.array(edges[:, (edges_width // 3) - 1: (edges_width // 3)]) right_edge = np.array(edges[:, (edges_width // 3) * 2 - 1: (edges_width // 3) * 2]) left_edge_length = left_edge.size right_edge_length = right_edge.size left_edge_likelihood = np.sum(left_edge) / left_edge_length right_edge_likelihood = np.sum(right_edge) / right_edge_length return left_edge_likelihood, right_edge_likelihood else: edges_height = edges.shape[0] top_edge = np.array(edges[(edges_height // 3) - 1:(edges_height // 3)]) bottom_edge = np.array(edges[(edges_height // 3) * 2 - 1:(edges_height // 3) * 2]) top_edge_length = top_edge.size bottom_edge_length = bottom_edge.size top_edge_likelihood = np.sum(top_edge) / top_edge_length bottom_edge_likelihood = np.sum(bottom_edge) / bottom_edge_length return top_edge_likelihood, bottom_edge_likelihood
补充说明
应用可接收拼图图像的行列数等参数,当前代码已完成图像块的正确提取,仅需优化拼接算法。现寻求可行的算法改进思路或新的解决方案。
内容的提问来源于stack exchange,提问作者M3mber
相关产品推荐
相关产品推荐

