Неверный Вывод Преобразования Значения Положения Пикселя

#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 его на ширину изображения.