有趣的photoshop特效(1):凸透镜python实现
生活随笔
收集整理的這篇文章主要介紹了
有趣的photoshop特效(1):凸透镜python实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、概念
ps中有凸透鏡效果,PS菜單欄->慮鏡->扭曲->球面化,也稱為魚眼效果,即通過凸透鏡所看到的視覺效果。下面來用算法來實(shí)現(xiàn)該效果。
二、算法思想
主要應(yīng)用的是圖像插值算法,以圖像中的一個(gè)點(diǎn)為中心,該中心即為透鏡中心,慢慢的往四周插值擴(kuò)散,如下所示。
實(shí)現(xiàn)需要一個(gè)映射函數(shù),將原坐標(biāo)映射到外圍的對(duì)應(yīng)坐標(biāo),參考凸透鏡效果算法matlab版。很多函數(shù),只要是凸函數(shù)(函數(shù)的二階導(dǎo)數(shù)大于等于零),都可以實(shí)現(xiàn)以上功能,比如y=x^2/r;?y=x^3/r; y = r*log(x+1) / log (r+1),這里我用的是y = x^2/r。其中x是原圖像坐標(biāo)到圓心的距離,y是映射后的新坐標(biāo)到圓心的距離。
三、效果
?
四、Python代碼
import cv2 import numpy as np img = cv2.imread('D:/Code/python/Data/dog.jpg') #img = cv2.imread('me.jpg') row, col, dim = img.shape new_img = np.zeros([row, col, dim], dtype=np.uint8)#cv2.imshow('img', img) #cv2.waitKey(0)# center_i = row / 2 center_j = col / 2 radius = min(center_i, center_j) # 防止前面賦值越界# i, j為new_img的坐標(biāo),下面要找到原圖像的對(duì)應(yīng)坐標(biāo) for i in range(row):for j in range(col):y = np.sqrt((i - center_i)**2 + (j - center_j)**2) # 新坐標(biāo)i,j與圓心距離new_img[i, j, :] = img[i, j, :]if (y <= radius): # 圓心內(nèi)的像素要分配新的位置original_i = np.int(np.floor(y*(i-center_i) / radius + center_i)) # 根據(jù)現(xiàn)有坐標(biāo)找回原圖坐標(biāo),這里不懂,記錄下來original_j = np.int(np.floor(y*(j-center_j) / radius + center_j))new_img[i, j, :] = img[original_i, original_j, :]cv2.imshow('new_img', new_img) cv2.waitKey(0)?
總結(jié)
以上是生活随笔為你收集整理的有趣的photoshop特效(1):凸透镜python实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql截取字符串后面四位
- 下一篇: 简单的抽卡模拟器1.2