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读取html中指定元素生成excle文件示例
Apr 03 Python
python爬虫常用的模块分析
Aug 29 Python
python统计文本字符串里单词出现频率的方法
May 26 Python
Numpy 将二维图像矩阵转换为一维向量的方法
Jun 05 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
Jun 05 Python
Flask框架Jinjia模板常用语法总结
Jul 19 Python
Tensorflow:转置函数 transpose的使用详解
Feb 11 Python
Python3如何在Windows和Linux上打包
Feb 25 Python
Python处理PDF与CDF实例
Feb 26 Python
Django crontab定时任务模块操作方法解析
Sep 10 Python
Python pygame实现中国象棋单机版源码
Jun 20 Python
python热力图实现的完整实例
Jun 25 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实现采集程序原理和简单示例代码
2007/03/18 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
PHP设计模式之观察者模式实例
2016/02/22 PHP
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
javascript parseInt 函数分析(转)
2009/03/21 Javascript
十个优秀的Ajax/Javascript实例网站收集
2010/03/31 Javascript
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
JavaScript实现将文本框的值插入指定位置的方法
2015/08/13 Javascript
简介alert()与console.log()的不同
2015/08/26 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
基于Vue 实现一个中规中矩loading组件
2019/04/03 Javascript
vue权限问题的完美解决方案
2019/05/08 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
python使用scrapy解析js示例
2014/01/23 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
2017/11/06 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
python绘制热力图heatmap
2020/03/23 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
python不同系统中打开方法
2020/06/23 Python
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
StubHub新加坡:购买和出售全球活动门票
2017/03/10 全球购物
关于学习的演讲稿
2014/05/10 职场文书
乡镇干部个人对照检查材料思想汇报(原创篇)
2014/09/28 职场文书
优秀团员自我评价
2015/03/10 职场文书
上下班时间调整通知
2015/04/23 职场文书
大学生青年志愿者活动总结
2015/05/06 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
欢迎新生标语2015
2015/07/16 职场文书
Python中glob库实现文件名的匹配
2021/06/18 Python
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python