Python3实现图像像素转摩斯密码输出错误,求排查问题
错误原因及修正方案
- 像素位置计算错误
挑战明确要求像素位置计算规则为行号 * 100 + 列号,你的代码仅提取了X坐标(列号)作为像素位置,完全丢弃了Y坐标(行号),所有位置值计算全部错误。 - 白色像素匹配规则错误
测试图为单通道二值图,目标白色像素值为1,你用三通道纯白[255,255,255]匹配,且cv2.imread默认读取BGR三通道格式,导致提取到的像素点完全不是目标点。 - 偏移量计算逻辑冗余错误
坐标列表转字符串再清洗转回列表的操作完全多余,固定循环40次的逻辑没有适配实际白色像素数量,额外添加的负值过滤逻辑也不符合规则要求,进一步破坏了偏移量结果。 - 摩斯密码字典缺失
你的摩斯映射字典缺少大量符号规则,也没有实现空格分隔解码的逻辑,就算前面步骤正确,解码也会失败。
修正后的Python3代码
import cv2 import numpy as np # 以灰度模式读取图像 im = cv2.imread('PNG.png', cv2.IMREAD_GRAYSCALE) # 提取所有像素值为1的坐标,Y为行号,X为列号 Y, X = np.where(im == 1) # 按规则计算每个白色像素的实际位置 positions = [Y[i] * 100 + X[i] for i in range(len(Y))] pre_pos = 0 morse_code = "" answer = "" # 完整摩斯密码字典 char_morse_dict={ 'A':'.-','B':'-...','C':'-.-.','D':'-..','E':'.','F':'..-.', 'G':'--.','H':'....','I':'..','J':'.---','K':'-.-','L':'.-..', 'M':'--','N':'-.','O':'---','P':'.--.','Q':'--.-','R':'.-.', 'S':'...','T':'-','U':'..-','V':'...-','W':'.--','X':'-..-', 'Y':'-.--','Z':'--..','0':'-----','1':'.----','2':'..---','3':'...--', '4':'....-','5':'.....','6':'-....','7':'--...','8':'---..','9':'----.', '.':'.-.-.-',',':'--..--','?':'..--..','\'':'.----.','/':'-..-.','(':'-.--.-', ')':'-.--.-',':':'---...',';':'-.-.-.','=':'-...-','+':'.-.-.','-':'-....-', '_':'..--.-','"':".-..-.",'$':'...-..-','':'' } for idx, pos in enumerate(positions): # 第一个像素ASCII就是位置本身,后续为当前位置减上一个位置 if idx == 0: ascii_code = pos else: ascii_code = pos - pre_pos symbol = chr(ascii_code) if symbol != ' ': morse_code += symbol else: # 遇到空格解码当前摩斯字符 char = [k for k, v in char_morse_dict.items() if v == morse_code][0] answer += char morse_code = "" pre_pos = pos # 处理最后一个摩斯字符 if morse_code: char = [k for k, v in char_morse_dict.items() if v == morse_code][0] answer += char print(answer)
运行后即可输出正确结果Q7R7O5R7UU。
内容的提问来源于stack exchange,提问作者LMBozz
相关产品推荐
相关产品推荐

