Архив метки: сферизация изображения

сферизация изображения на python

Сферизация изображения или эффект рыбий глаз на python

Изначально думал что сделаю эффект рыбьего глаза буквально за 5 минут, найдя нужный скрипт в библиотеке openCV. Но на деле оказалось все не так просто и просто одновременно. И так, для сферизации нам нужно сделать матрицу преобразований, которая будет показывать в какое место передвигать каждый пиксель. И после этого применить функцию cv2.remap . На вход этой функции подается «карта исходных точек» и «карта точек куда их надо переместить», а так как все точки изображения передать невозможно, то функция cv2.remap произведет сглаживание остальных точек, в нашем случае cv2.INTER_LINEAR. Для ручной генерации матрицы преобразований нужно переходить в полярную систему координат, делать какие-то циклы итд итп. Поэтому решено было обойтись функциями openCV. А именно initUndistortRectifyMap про которую лучше почитать на официальном сайте opencv. На вход достаточно передать матрицу 3 на 3 и искажающие коэффициенты. Данный вариант и продемонстрирован в коде.

import sys
import cv2
import numpy as np

def main(argv):
    src = cv2.imread('img/cells.png')
    h, w = src.shape[0:2]
    # получаем высоту и ширину изображения для 
    print(h, w)

    # заполняем матрицу преобразования. сначала все нулями
    intrinsics = np.zeros((3, 3), np.float64)

    # матрица intrinsics
    intrinsics[0, 0] = 3500
    intrinsics[1, 1] = 3500
    intrinsics[2, 2] = 1.0
    intrinsics[0, 2] = w/2.
    intrinsics[1, 2] = h/2.
    print(intrinsics)

    newCamMtx = np.zeros((3, 3), np.float64)
    newCamMtx[0, 0] = 3500
    newCamMtx[1, 1] = 3500
    newCamMtx[2, 2] = 1.0
    newCamMtx[0, 2] = w/2.
    newCamMtx[1, 2] = h/2.

    dist_coeffs = np.zeros((1, 4), np.float64)
    dist_coeffs[0, 0] = -40.0
    dist_coeffs[0, 1] = 0.0
    dist_coeffs[0, 2] = 0.0
    dist_coeffs[0, 3] = -0.0
    print dist_coeffs

    map1, map2 = cv2.initUndistortRectifyMap(intrinsics, dist_coeffs, None, newCamMtx, src.shape[:2], cv2.CV_16SC2)
    res = cv2.remap(src, map1, map2, cv2.INTER_LINEAR)

    cv2.imshow("Image_res", res)
    cv2.imshow("Image_origin", src)
    cv2.waitKey(0)

if __name__ == '__main__':
    main(sys.argv)

В результате выполнения программы вы получите оригинальное изображение и сферизованное. Надо сказать, что здесь применен эффект обратный рыбьему глазу, но вы без труда сможете применить другие коэффициенты для ваших нужд. В примере использовано изображение сетка — чтобы наглядно продемонстрировать сферические искажения.

сферизация изображения на python

Эффект рыбий глаз на python