Python实现PS滤镜特效之扇形变换效果示例


Posted in Python onJanuary 26, 2018

本文实例讲述了Python实现PS滤镜特效之扇形变换效果。分享给大家供大家参考,具体如下:

这里用 Python 实现 PS 滤镜中的一种几何变换特效,称为扇形变换,将图像扭曲成一个扇形,具体的算法原理和效果图可以参考附录说明

import numpy as np
from skimage import img_as_float
import matplotlib.pyplot as plt
from skimage import io
import math
import numpy.matlib
file_name2='D:/Visual Effects/PS Algorithm/4.jpg'
img=io.imread(file_name2)
img = img_as_float(img)
# control the radius of the inner circle
radius = 150
# control the distance between the inner circle and outer circle
high = 200
angle = 0
spreadAngle = math.pi
# set the center of the circle, proportion of the image size
centerX = 0.5
centerY = 1.0
row, col, channel = img.shape
icenterX = col * centerX
icenterY = row * centerY
img_out = img * 0
xx = np.arange (col)
yy = np.arange (row)
x_mask = numpy.matlib.repmat (xx, row, 1)
y_mask = numpy.matlib.repmat (yy, col, 1)
y_mask = np.transpose(y_mask)
xx_dif = x_mask - icenterX
yy_dif = y_mask - icenterY
theta = np.arctan2(-yy_dif, -xx_dif+0.0001)
r = np.sqrt(xx_dif*xx_dif + yy_dif * yy_dif)
theta = np.mod(theta, 2 * math.pi)
x1_mask = col * theta/(spreadAngle+0.00001)
y1_mask = row * (1-(r-radius)/(high+0.00001))
'''
mask = x1_mask < 0
x1_mask = x1_mask * (1 - mask)
mask = x1_mask > (col - 1)
x1_mask = x1_mask * (1 - mask) + (x1_mask * 0 + col -2) * mask
mask = y1_mask < 0
y1_mask = y1_mask * (1 - mask)
mask = y1_mask > (row -1)
y1_mask = y1_mask * (1 - mask) + (y1_mask * 0 + row -2) * mask
'''
int_x = np.floor (x1_mask)
int_x = int_x.astype(int)
int_y = np.floor (y1_mask)
int_y = int_y.astype(int)
for ii in range(row):
  for jj in range (col):
    new_xx = int_x [ii, jj]
    new_yy = int_y [ii, jj]
    if x1_mask [ii, jj] < 0 or x1_mask [ii, jj] > col -1 :
      continue
    if y1_mask [ii, jj] < 0 or y1_mask [ii, jj] > row -1 :
      continue
    img_out[ii, jj, :] = img[new_yy, new_xx, :]
plt.figure (1)
plt.title('3water.com')
plt.imshow (img)
plt.axis('off')
plt.figure (2)
plt.title('3water.com')
plt.imshow (img_out)
plt.axis('off')
plt.show()

附录:PS 滤镜— —扇形warp

clc;
  clear all;
  close all;
  addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorithm');
  I=imread('4.jpg');
  I=double(I);
  Image=I/255;
  [height, width, depth]=size(Image);
  % set the parameters
  radius = 150; % control the radius of the inner circle
  high = 200;  % control the distance between the inner circle and outer circle
  angle = 0;       
  spreadAngle=pi;  
  centerX = 0.5; % set the center of the circle, proportion of the image size
  centerY = 1.0;
  icenterX=width*centerX;
  icenterY=height*centerY;
  Image_new=Image*0;
  for i=1:height
    for j=1:width
      dx=j-icenterX;
      dy=i-icenterY;
      theta=atan2(-dy, -dx)+angle;
      r=sqrt(dy*dy+dx*dx);
      theta=mod(theta, 2*pi);
      x=width * theta/(spreadAngle+0.00001);
      y=height * (1-(r-radius)/(high+0.00001));
  % %     if (x<=1)   x=1; end
  % %     if (x>=width)  x=width-1; end;
  % %     if (y>=height) y=height-1; end;
  % %     if (y<1) y=1;   end;
  % %     
      if (x<=1)   continue; end
      if (x>=width)  continue; end;
      if (y>=height) continue; end;
      if (y<1) continue;   end;
      x1=floor(x);
      y1=floor(y);
      p=x-x1;
      q=y-y1;
      Image_new(i,j,:)=(1-p)*(1-q)*Image(y1,x1,:)+p*(1-q)*Image(y1,x1+1,:)...
        +q*(1-p)*Image(y1+1,x1,:)+p*q*Image(y1+1,x1+1,:);
    end
  end
  imshow(Image_new)
  imwrite(Image_new, 'out.jpg');

参考来源:http://www.jhlabs.com/index.html

本例Python运行效果:

原图

Python实现PS滤镜特效之扇形变换效果示例

效果图

Python实现PS滤镜特效之扇形变换效果示例

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python冒泡排序简单实现方法
Jul 09 Python
Python三级目录展示的实现方法
Sep 28 Python
python使用opencv进行人脸识别
Apr 07 Python
Python进阶之递归函数的用法及其示例
Jan 31 Python
python实现归并排序算法
Nov 22 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
python协程gevent案例 爬取斗鱼图片过程解析
Aug 27 Python
django删除表重建的实现方法
Aug 28 Python
给Python学习者的文件读写指南(含基础与进阶)
Jan 29 Python
python爬虫之selenium库的安装及使用教程
May 23 Python
Python的三个重要函数详解
Jan 18 Python
Django + Taro 前后端分离项目实现企业微信登录功能
Apr 07 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
Jan 26 #Python
Python实现PS滤镜功能之波浪特效示例
Jan 26 #Python
Python使用pickle模块存储数据报错解决示例代码
Jan 26 #Python
python如何重载模块实例解析
Jan 25 #Python
Python进程间通信Queue实例解析
Jan 25 #Python
Python操作Redis之设置key的过期时间实例代码
Jan 25 #Python
python编程使用selenium模拟登陆淘宝实例代码
Jan 25 #Python
You might like
php入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
PHP 之Section与Cookie使用总结
2012/09/14 PHP
PHP可变函数的使用详解
2013/06/14 PHP
探寻PHP脚本不报错的原因
2014/06/12 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
2019/05/06 PHP
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
Script的加载方法小结
2011/01/12 Javascript
javascript动态加载二
2012/08/22 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
js html实现计算器功能
2018/11/13 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
js控制随机数生成概率代码实例
2019/03/21 Javascript
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
vue实现登录功能
2020/12/31 Vue.js
node脚手架搭建服务器实现token验证的方法
2021/01/20 Javascript
[00:43]TI7不朽珍藏III——幽鬼不朽展示
2017/07/15 DOTA
跟老齐学Python之深入变量和引用对象
2014/09/24 Python
Windows上使用Python增加或删除权限的方法
2018/04/24 Python
使用python Telnet远程登录执行程序的方法
2019/01/26 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
英国最大的电子产品和家电零售企业:Currys PC World
2016/09/24 全球购物
小区停车场管理制度
2014/01/27 职场文书
会展策划与管理专业大学生职业生涯规划
2014/02/07 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
给客户的感谢信
2015/01/21 职场文书
信息技术国培研修日志
2015/11/13 职场文书
财务人员廉洁自律心得体会
2016/01/13 职场文书
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL