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数据类型学习笔记
Jan 13 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
Jun 09 Python
Python测试人员需要掌握的知识
Feb 08 Python
对Python中Iterator和Iterable的区别详解
Oct 18 Python
解决Pycharm界面的子窗口不见了的问题
Jan 17 Python
python 利用jinja2模板生成html代码实例
Oct 10 Python
numpy.ndarray 实现对特定行或列取值
Dec 05 Python
python实现多进程按序号批量修改文件名的方法示例
Dec 30 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
基于Python爬取fofa网页端数据过程解析
Jul 13 Python
python编写实现抽奖器
Sep 10 Python
用Python将库打包发布到pypi
Apr 13 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简单静态页生成过程
2008/03/27 PHP
PHP中替换换行符的几种方法小结
2012/10/15 PHP
php正则preg_replace_callback函数用法实例
2015/06/01 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
dess中一个简单的多路委托的实现
2010/07/20 Javascript
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
2011/06/28 Javascript
解决Extjs上传图片无法预览的解决方法
2012/03/22 Javascript
Package.js  现代化的JavaScript项目make工具
2012/05/23 Javascript
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
jQuery 绑定事件到动态创建的元素上的方法实例
2013/08/18 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
jquery判断复选框是否选中进行答题提示特效
2015/12/10 Javascript
AngularJS国际化详解及示例代码
2016/08/18 Javascript
jquery实现文本框的禁用和启用
2016/12/07 Javascript
vue params、query传参使用详解
2017/09/12 Javascript
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
微信小程序swiper左右扩展各显示一半代码实例
2019/12/05 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
matplotlib中legend位置调整解析
2017/12/19 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
Python函数参数操作详解
2018/08/03 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
参观监狱心得体会
2014/01/02 职场文书
工程专业求职自荐书范文
2014/02/18 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
经典演讲稿开场白
2014/08/25 职场文书
小学教师见习总结
2015/06/23 职场文书
趣味运动会加油词
2015/07/18 职场文书
【海涛解说】暗牧也疯狂,牛蛙成配角
2022/04/01 DOTA
利用Apache Common将java对象池化的问题
2022/06/16 Servers
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
2022/07/15 Java/Android