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 相关文章推荐
Python中的元类编程入门指引
Apr 15 Python
python实现分页效果
Oct 25 Python
PyQt5每天必学之拖放事件
Aug 27 Python
pygame游戏之旅 添加游戏介绍
Nov 20 Python
python退出命令是什么?详解python退出方法
Dec 10 Python
在Python中,不用while和for循环遍历列表的实例
Feb 20 Python
Python向excel中写入数据的方法
May 05 Python
python 五子棋如何获得鼠标点击坐标
Nov 04 Python
python多进程并发demo实例解析
Dec 13 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
Mar 30 Python
python 如何用terminal输入参数
May 25 Python
Python语言中的数据类型-序列
Feb 24 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
php curl的深入解析
2013/06/02 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
2013/06/03 PHP
基于empty函数的输出详解
2013/06/17 PHP
PHP定时任务延缓执行的实现
2014/10/08 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
PHP设计模式之单例模式定义与用法分析
2019/03/26 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
JavaScript中的16进制字符(改进)
2011/11/21 Javascript
深入理解JavaScript 闭包究竟是什么
2013/04/12 Javascript
用JavaScript实现动画效果的方法
2013/07/20 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
vue事件修饰符和按键修饰符用法总结
2017/07/25 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
通过实例学习React中事件节流防抖
2019/06/17 Javascript
Python 面试中 8 个必考问题
2018/11/16 Python
django2笔记之路由path语法的实现
2019/07/17 Python
Python使用Pandas对csv文件进行数据处理的方法
2019/08/01 Python
利用python 下载bilibili视频
2020/11/13 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
html5摇一摇代码优化包括DeviceMotionEvent等等
2014/09/01 HTML / CSS
西班牙床垫网上商店:Colchones.es
2018/05/06 全球购物
REISS美国官网:伦敦最受欢迎的时尚品牌
2019/08/16 全球购物
简单说说tomcat的配置
2013/05/28 面试题
艺术专业大学生自我评价
2013/09/22 职场文书
毕业生自我鉴定
2013/11/05 职场文书
元旦红领巾广播稿
2014/02/19 职场文书
模特大赛策划方案
2014/05/28 职场文书
2019财务毕业实习报告
2019/06/27 职场文书
小学生优秀作文范文(六篇)
2019/07/10 职场文书
创业计划书之健康营养产业
2019/10/15 职场文书
压缩Redis里的字符串大对象操作
2021/06/23 Redis
springboot+rabbitmq实现智能家居实例详解
2022/07/23 Java/Android
基于Python实现西西成语接龙小助手
2022/08/05 Golang
spring boot实现文件上传
2022/08/14 Java/Android