Python: реализация алгоритма выпрямления текста - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь выпрямить текст на изображении монеты в оттенках серого (на нем я использовал обнаружение краев Канни, поэтому оно выглядит примерно так: https://encrypted -tbn0.gstatic.com / images? Q= tbn: ANd9GcQaaRPYtqZuy-o-zajZCWxmPDGBRbUJkTPmbMhIL9ex4gd-JNWjxA & s ) и необходимо реализовать в питоне следующее уравнение:

Учитывая уравнение окружности, P (x, y ', предположим,') - это пиксель исходного изображения, а p' (x ', y') - это новый пиксель выпрямленного изображения, рассчитанный по формуле:

x' = n * sin(z) + (w/2)
y' = n * cos(z) + (h/2)

с учетом: π

, где w и h - высота и ширина исходного изображения соответственно, b - половина общего числа столбцов исходного изображения, а c - количество строк внешнего кругаизображения, содержащие символы. Я программировал на Python раньше, но я впервые манипулирую пикселями.

Пока что я перебираю все пиксели изображения, перехватываю каждый из них и пытаюсь приблизить ограничение, используя диапазон(3, -3), чтобы создать новые координаты для моего выходного изображения. Я никогда раньше не пытался реализовать подобное уравнение, поэтому я просто потерян здесь.

import math
import numpy as np

from PIL import Image


im = Image.open('dilation.jpg')
im = np.array(im)

imageW = im.shape[0]
imageH = im.shape[1]
b = round(imageW / 2)

#Arbitrarily setting n, not sure how to properly implement
n = b + 1

#Create blank pixel map for straightened text image
new = np.zeros(im.shape)

#Loop through image to grab pixels
for x in range(imageW):
    for y in range(imageH):
        rgb = im[x,y]
        #Set new coordinates, not sure how to implement equation
        for i in range(3, -3,-1):
            new_x = round(n * math.sin(i) + (imageW / 2))
            new_y = round(n * math.cos(i) + (imageH / 2))
            #Place pixel at new coordinates in output map
            new[new_x, new_y] = rgb

#Construct output image from pixel map
new = Image.fromarray(new.astype('uint8'), 'RGB')

#Show output image
new.show()
...