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用于url解码和中文解析的小脚本(python url decoder)
Aug 11 Python
Python实现合并字典的方法
Jul 07 Python
Python实现简单的多任务mysql转xml的方法
Feb 08 Python
python中os和sys模块的区别与常用方法总结
Nov 14 Python
Python-接口开发入门解析
Aug 01 Python
Python中Subprocess的不同函数解析
Dec 10 Python
Tensorflow 模型转换 .pb convert to .lite实例
Feb 12 Python
Python flask路由间传递变量实例详解
Jun 03 Python
Python实现加密接口测试方法步骤详解
Jun 05 Python
Python数据可视化图实现过程详解
Jun 12 Python
Python通过类的组合模拟街道红绿灯
Sep 16 Python
python 绘制国旗的示例
Sep 27 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中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
一个好用的PHP验证码类实例分享
2013/12/27 PHP
ThinkPHP缓存方法S()概述
2014/06/13 PHP
PHP实现动态创建XML文档的方法
2018/03/30 PHP
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
javascript表单验证大全
2015/08/12 Javascript
Bootstrap富文本组件wysiwyg数据保存到mysql的方法
2016/05/09 Javascript
JavaScript中日常收集常见的10种错误(推荐)
2017/01/08 Javascript
Canvas实现动态的雪花效果
2017/02/13 Javascript
JavaScript如何一次性展示几万条数据
2017/03/30 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
详解Vue.js中.native修饰符
2018/04/24 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
Django模板继承 extend标签实例代码详解
2019/05/16 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
2019/08/20 Javascript
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
Python探索之Metaclass初步了解
2017/10/28 Python
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
Python随机函数random()使用方法小结
2018/04/29 Python
详解Python with/as使用说明
2018/12/13 Python
Python在图片中插入大量文字并且自动换行
2019/01/02 Python
python requests证书问题解决
2019/09/05 Python
python实现mean-shift聚类算法
2020/06/10 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
互联网创业计划书写作技巧攻略
2014/03/23 职场文书
旅行社优秀创业计划书
2014/08/16 职场文书
党员教师个人对照检查材料范文
2014/09/25 职场文书
伏羲庙导游词
2015/02/09 职场文书
应聘教师自荐信
2015/03/26 职场文书
学前教育见习总结
2015/06/23 职场文书
六年级情感作文之500字
2019/10/23 职场文书
4种非常实用的python内置数据结构
2021/04/28 Python
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
2021/06/26 MySQL
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang