Python实现PS滤镜的万花筒效果示例


Posted in Python onJanuary 23, 2018

本文实例讲述了Python实现PS滤镜的万花筒效果。分享给大家供大家参考,具体如下:

这里用 Python 实现 PS 的一种滤镜效果,称为万花筒。也是对图像做各种扭曲变换,最后图像呈现的效果就像从万花筒中看到的一样:

图像的效果可以参考附录说明。具体Python代码如下:

import matplotlib.pyplot as plt
from skimage import io
from skimage import img_as_float
import numpy as np
import numpy.matlib
import math
file_name='D:/Visual Effects/PS Algorithm/4.jpg';
img=io.imread(file_name)
img = img_as_float(img)
row, col, channel = img.shape
# set the parameters
radius = 100.0
angle = math.pi/3
angle2 = math.pi/4
sides = 10.0
# set the center of the circle, proportion of the image size
centerX = 0.5
centerY = 0.5
iWidth=col
iHeight=row
center_x=iWidth*centerX
center_y=iHeight*centerY
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 - center_x
yy_dif = y_mask - center_y
r = np.sqrt(xx_dif * xx_dif + yy_dif * yy_dif)
theta = np.arctan2(yy_dif, xx_dif+0.0001) - angle - angle2
temp_theta=theta/math.pi*sides*0.5
temp_r = np.mod(temp_theta, 1.0)
mask_1 = temp_r < 0.5
theta = temp_r * 2 * mask_1 + (1-temp_r) * 2 * (1 - mask_1)
radius_c=radius/np.cos(theta)
temp_r = np.mod (r/radius_c, 1.0)
mask_1 = temp_r < 0.5
r = radius_c * (temp_r * 2 * mask_1 + (1-temp_r) * 2 * (1 - mask_1))
theta = theta + angle
x1_mask = r * np.cos(theta) + center_x
y1_mask = r * np.sin(theta) + center_y
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
img_out = img * 1.0
int_x = np.floor (x1_mask)
int_x = int_x.astype(int)
int_y = np.floor (y1_mask)
int_y = int_y.astype(int)
p_mask = x1_mask - int_x
q_mask = y1_mask - int_y
img_out = img * 1.0
for ii in range(row):
  for jj in range (col):
    new_xx = int_x [ii, jj]
    new_yy = int_y [ii, jj]
#    p = p_mask[ii, jj]
#    q = q_mask[ii, jj]
    img_out[ii, jj, :] = img[new_yy, new_xx, :]
plt.figure (1)
plt.imshow (img)
plt.axis('off')
plt.figure (2)
plt.imshow (img_out)
plt.axis('off')
plt.show()

附:PS 滤镜万花筒效果原理

clc;
  clear all;
  close all;
  addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorithm');
  I=imread('4.jpg');
  I=double(I);
  Image=I/255;
  sz=size(Image);
  % set the parameters
  radius = 150;
  angle = pi/4;
  angle2=pi/4;
  sides=10;
  centerX = 0.5;  % set the center of the circle, proportion of the image size
  centerY = 0.5;
  iWidth=sz(2);
  iHeight=sz(1);
  icenterX=iWidth*centerX;
  icenterY=iHeight*centerY;
  Image_new=Image;
  for i=1:sz(1)
    for j=1:sz(2)
      dx=j-icenterX;
      dy=i-icenterY;
      r=sqrt(dy*dy+dx*dx);
      theta=atan2(dy, dx)-angle-angle2;
      temp_theta=theta/pi*sides*0.5 ;
      theta=triangle(temp_theta);
      if (radius)
        c=cos(theta);
        radius_c=radius/c;
        r=radius_c * triangle(r/radius_c);
      end
      theta=theta+angle;
      x=r * cos(theta)+icenterX;
      y=r * sin(theta)+icenterY;
      if (x<=1)   x=1; end
      if (x>=sz(2)) x=sz(2)-1; end;
      if (y>=sz(1)) y=sz(1)-1; end;
      if (y<1) y=1;   end;
  % % %     if (x<=1)   continue; end
  % % %     if (x>=sz(2))  continue; end;
  % % %     if (y>=sz(1)) 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实现PS滤镜的万花筒效果示例

效果图:

Python实现PS滤镜的万花筒效果示例

Python实现PS滤镜的万花筒效果示例

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

Python 相关文章推荐
使用wxPython获取系统剪贴板中的数据的教程
May 06 Python
Python实现的文本简单可逆加密算法示例
May 18 Python
python实现决策树、随机森林的简单原理
Mar 26 Python
Python3.4 tkinter,PIL图片转换
Jun 21 Python
python调用虹软2.0第三版的具体使用
Feb 22 Python
PyTorch的深度学习入门教程之构建神经网络
Jun 27 Python
pyqt5 使用cv2 显示图片,摄像头的实例
Jun 27 Python
Python pandas RFM模型应用实例详解
Nov 20 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
Feb 06 Python
在tensorflow以及keras安装目录查询操作(windows下)
Jun 19 Python
Python用tkinter实现自定义记事本的方法详解
Mar 31 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
Apr 07 Python
python处理csv数据动态显示曲线实例代码
Jan 23 #Python
Python+matplotlib实现华丽的文本框演示代码
Jan 22 #Python
CentOS7.3编译安装Python3.6.2的方法
Jan 22 #Python
Python OpenCV实现图片上输出中文
Jan 22 #Python
python批量替换页眉页脚实例代码
Jan 22 #Python
python解析html提取数据,并生成word文档实例解析
Jan 22 #Python
Python复制Word内容并使用格式设字体与大小实例代码
Jan 22 #Python
You might like
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
ThinkPHP自动填充实现无限级分类的方法
2014/08/22 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
Laravel框架实现的rbac权限管理操作示例
2019/01/16 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
Laravel6.18.19如何优雅的切换发件账户
2020/06/14 PHP
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
jquery插件之easing 动态菜单
2010/08/21 Javascript
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
JavaScript函数的4种调用方法详解
2014/04/22 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
js查看一个函数的执行时间实例代码
2015/09/12 Javascript
javascript下使用Promise封装FileReader
2016/02/19 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
2016/08/02 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
完全深入学习Bootstrap表单
2016/11/28 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
2017/02/10 Javascript
angular1.x ui-route传参的三种写法小结
2018/08/31 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
Python MD5加密实例详解
2017/08/02 Python
详解如何在Apache中运行Python WSGI应用
2019/01/02 Python
python 实现在tkinter中动态显示label图片的方法
2019/06/13 Python
海淘母婴商城:国际妈咪
2016/07/23 全球购物
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
工作求职自荐信
2014/06/13 职场文书
爱耳日宣传活动总结
2014/07/05 职场文书
公司委托书范本5篇
2014/09/20 职场文书
销售员岗位职责范本
2015/04/11 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript