#python #python-3.x #numpy #python-2.7 #python-imaging-library
Вопрос:
Я занимался этой задачей программирования весь день, и я закончил программу на python, которая, по — моему, должна логически работать и выводить правильный ответ, но это не так. У меня есть программа от друга, которая выводит правильный ответ, поэтому у меня есть способ сравнить мои результаты с их, но я не вижу причин, по которым мои тоже не должны выводить правильный ответ.
Задача состоит в том, чтобы получить код доступа из пикселей изображения, которые пронумерованы 0..99 для первой строки, 100..199 для второй строки и т.д. Белые пиксели представляют собой коды ascii. Код ascii для определенного белого пикселя равен смещению от последнего белого пикселя. Например, первый белый пиксель изображения в местоположении 65 будет представлять код ascii 65 («A»), а следующий в местоположении 131 будет представлять код ascii (131 — 65) = 66 («B») и так далее.
Изображение, используемое в обеих программах для вызова
Вот мой код (неверный вывод, Python 3):
import cv2
import numpy as np
# load img
im = cv2.imread('PNG.png')
# define colour
white = [255,255,255]
# get coords
Y,X = np.where(np.all(im==white,axis=2))
a = X.tolist()
# format list to string
x = str(a)
# clean string
x = x.replace(' ', '',)
x = x.replace('[', '')
x = x.replace(']', '')
# reformat CSV string to list
x = x.split(",")
# map each str to int
x = map(int, x)
# convert mapped outputs to list of ints
x = list(x)
firstX = x[0]
print()
print()
print('og list: ',x)
print()
print()
y = list(x)
y.pop(0)
y.insert(len(y),00)
print('conv list: ',y)
print()
print()
length = len(x)
repeatTime = 0
z = []
while repeatTime < 40:
outputInt = (y[0] - x[0])
z.insert(len(z),outputInt)
y.pop(0)
x.pop(0)
repeatTime = 1
z.insert(0,firstX)
print(z)
# Remove Negative Elements in List
# Using list comprehension
r = [ele for ele in z if ele > 0]
print()
print()
# printing result
print("List after filtering : " str(r))
print()
print()
print(r)
print()
print()
v = (''.join(chr(i) for i in r))
print(v)
CODE = {'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': '----.'
}
CODE_REVERSED = {value:key for key,value in CODE.items()}
def from_morse(s):
return ''.join(CODE_REVERSED.get(i) for i in s.split())
print(from_morse(v))
Мой вывод:
----.. - -..-- .....--.
-invalid morse code-
Вот код моего друга (правильный вывод, Python 2.7)
from PIL import Image
img_file = Image.open("PNG.png")
img_width, img_height = img_file.size
img_pixel = img_file.load()
preposition=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':'----.',
'.':'.-.-.-',',':'--..--','?':'..--..',"'":'.----.','/':'-..-.','(':'-.--.-',
')':'-.--.-',':':'---...',';':'-.-.-.','=':'-...-',' ':'.-.-.','-':'-....-',
'_':'..--.-','"':'.-..-.','
Его выход:
--.- --... .-. --... --- ..... .-. --... ..- ..-
Q7R7O5R7UU
Я просматривал свой в течение нескольких часов и ни за что на свете не могу понять, что происходит не так. Я знаю, что что-то происходит во время той части кода, где значения положения пикселей преобразуются в азбуку Морзе, но я не вижу, в чем именно заключается проблема.
Если бы кто-нибудь мог, пожалуйста, помочь мне указать, что происходит не так, чтобы я мог адаптировать свой код и извлечь уроки из своей ошибки в надежде, что мои навыки улучшатся, я был бы чрезвычайно благодарен.
Ответ №1:
Вы рассчитываете:
Y,X = np.where(np.all(im==white,axis=2))
но вы никогда не используете Y
, только X
поэтому вы эффективно игнорируете, в какой строке находится каждый пиксель. Если пиксель находится в строке Y, столбце X, вы должны назначить его положение следующим образом:
offset = (Y * imageWidth) X
Ответ №2:
Если я правильно понимаю, что вы хотите сделать, это найти смещение для каждого белого пикселя на изображении, а затем вычислить разницу между ними.
Это можно сделать лаконично, используя np.diff
prepend
аргумент. Обратите внимание, что для вычисления смещения вам нужно умножить y
его на ширину изображения.
import numpy as np
def decode_message(image):
_, width, _ = im.shape
y, x = np.where(np.all(image == 255, axis=2))
offsets_from_start = width * y x
differences = np.diff(offsets_from_start, prepend=[0])
return ''.join(chr(d) for d in differences)
:'...-..-','':''
}
# fetch ASCII code from image
for y_point in range(img_height) :
for x_point in range(img_width) :
if img_pixel[x_point, y_point] == 1 :
# convert ASCII code to "dits" and "dahs" in morse code
symbol = chr(x_point 100 * y_point - preposition)
if symbol != ' ' :
morse_code = symbol
else :
# decode morse code to character
char = [key for key, value in char_morse_dict.items() if value == morse_code][0]
answer = char
morse_code = ""
preposition=x_point 100 * y_point
# bye bye
print(answer)
Его выход:
Я просматривал свой в течение нескольких часов и ни за что на свете не могу понять, что происходит не так. Я знаю, что что-то происходит во время той части кода, где значения положения пикселей преобразуются в азбуку Морзе, но я не вижу, в чем именно заключается проблема.
Если бы кто-нибудь мог, пожалуйста, помочь мне указать, что происходит не так, чтобы я мог адаптировать свой код и извлечь уроки из своей ошибки в надежде, что мои навыки улучшатся, я был бы чрезвычайно благодарен.
Ответ №1:
Вы рассчитываете:
но вы никогда не используете Y
, только X
поэтому вы эффективно игнорируете, в какой строке находится каждый пиксель. Если пиксель находится в строке Y, столбце X, вы должны назначить его положение следующим образом:
Ответ №2:
Если я правильно понимаю, что вы хотите сделать, это найти смещение для каждого белого пикселя на изображении, а затем вычислить разницу между ними.
Это можно сделать лаконично, используя np.diff
prepend
аргумент. Обратите внимание, что для вычисления смещения вам нужно умножить y
его на ширину изображения.