Вопрос по python – Преобразование изображения в OpenCV

19

Этот вопрос связан с этим вопросом:How to remove convexity defects in sudoku square

Я пытался реализоватьnikie's answer вMathematica to OpenCV-Python, Но я застрял на последнем этапе процедуры.

т.е. я получил все точки пересечения в квадрате, как показано ниже:

enter image description here

Теперь я хочу превратить это в идеальный квадрат размером (450 450), как показано ниже:

enter image description here

(Не берите в голову разницу яркости двух изображений).

Question: Как я могу сделать это в OpenCV-Python? я используюcv2 версия.

Как он предложил в своем ответе, просто используйте стандартные преобразования (те, которые вы пытались использовать в своем первом вопросе) для каждой отдельной ячейки ... etarion
Я использовал перспективу деформации, которая использовала 4 угла для трансформации. Вы говорите, чтобы использовать то же самое, беря 4 очка каждой клетки? разве это не трудоемкий процесс? Abid Rahman K
@AbidRahmanK: я не проверял это, но я ожидаю, что время работы преобразования перспективной деформации пропорционально количеству выходных пикселей. Таким образом, если бы он был достаточно быстрым, чтобы преобразовать всю сетку, он должен быть достаточно быстрым, чтобы преобразовать 81 ячейку сетки, которые составляют всего 1/81 размера сетки. Niki
Вы говорите о встроенном программировании? Полагаю, нет, поскольку вы используете python ... на настольном компьютере, нет, это не должно быть заметно, поскольку в нем всего 81 ячейка ... etarion

Ваш Ответ

2   ответа
1

вы можете подключить их к cv2.getPerspectiveTransform и использовать этот результат в cv2.warpPerspective. Дает вам хороший плоский результат.

33

Помимо предложения etarion, вы также можете использоватьпереназначить функция. Я написал быстрый сценарий, чтобы показать, как вы можете сделать это. Как вы видите, на Python это действительно просто. Это тестовое изображение:

distorted image

и это результат после деформации:

warped image

И вот код:

import cv2
from scipy.interpolate import griddata
import numpy as np

grid_x, grid_y = np.mgrid[0:149:150j, 0:149:150j]
destination = np.array([[0,0], [0,49], [0,99], [0,149],
                  [49,0],[49,49],[49,99],[49,149],
                  [99,0],[99,49],[99,99],[99,149],
                  [149,0],[149,49],[149,99],[149,149]])
source = np.array([[22,22], [24,68], [26,116], [25,162],
                  [64,19],[65,64],[65,114],[64,159],
                  [107,16],[108,62],[108,111],[107,157],
                  [151,11],[151,58],[151,107],[151,156]])
grid_z = griddata(destination, source, (grid_x, grid_y), method='cubic')
map_x = np.append([], [ar[:,1] for ar in grid_z]).reshape(150,150)
map_y = np.append([], [ar[:,0] for ar in grid_z]).reshape(150,150)
map_x_32 = map_x.astype('float32')
map_y_32 = map_y.astype('float32')

orig = cv2.imread("tmp.png")
warped = cv2.remap(orig, map_x_32, map_y_32, cv2.INTER_CUBIC)
cv2.imwrite("warped.png", warped)

Я полагаю, вы можете Google и найти, что делает griddata. Короче говоря, он выполняет интерполяцию, и здесь мы используем его для преобразования разреженных отображений в плотные отображения, поскольку cv2.remap требует плотных отображений. Нам просто нужно преобразовать значения в float32, так как OpenCV жалуется на тип float64. Пожалуйста, дайте мне знать, как это происходит.

UpdateЕсли вы не хотите полагаться на Scipy, один из способов - реализовать функцию 2D-интерполяции в вашем коде, например, посмотреть исходный код griddata на Scipy или более простой код, подобный этому.http://inasafe.readthedocs.org/en/latest/_modules/engine/interpolation2d.html который зависит только от NumPy. Тем не менее, я предлагаю использовать для этого Scipy или другую библиотеку, хотя я понимаю, почему для таких случаев лучше использовать только CV2 и numpy. Мне бы хотелось услышать, как ваш окончательный код решает судоку.

Error: User Rate Limit Exceeded
I'd like to hear how your final code solves SudokusError: User Rate Limit Exceeded Abid Rahman K
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Abid Rahman K
Error: User Rate Limit Exceededcv2.remapError: User Rate Limit Exceeded Abid Rahman K

Похожие вопросы