Изначально думал что сделаю эффект рыбьего глаза буквально за 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)
В результате выполнения программы вы получите оригинальное изображение и сферизованное. Надо сказать, что здесь применен эффект обратный рыбьему глазу, но вы без труда сможете применить другие коэффициенты для ваших нужд. В примере использовано изображение сетка — чтобы наглядно продемонстрировать сферические искажения.