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系列之浅谈pickle模块封装和拆封数据对象的方法
May 23 Python
Python实现豆瓣图片下载的方法
May 25 Python
python实现折半查找和归并排序算法
Apr 14 Python
python僵尸进程产生的原因
Jul 21 Python
python互斥锁、加锁、同步机制、异步通信知识总结
Feb 11 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
Python OpenCV获取视频的方法
Feb 28 Python
一文带你了解Python中的字符串是什么
Nov 20 Python
如何更优雅地写python代码
Jul 02 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
Jul 31 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
Jul 02 Python
用Python制作灯光秀短视频的思路详解
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实现文件下载更能介绍
2012/11/23 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
PHP加密解密字符串汇总
2015/04/26 PHP
php上传图片类及用法示例
2016/05/11 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
JavaScript 高级篇之函数 (四)
2012/04/07 Javascript
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
2012/06/22 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
node.js中的fs.utimesSync方法使用说明
2014/12/15 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
jQuery 弹出层插件(推荐)
2016/05/24 Javascript
详解Vue.js入门环境搭建
2017/03/17 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
vue中将html字符串转换成html后遇到的问题小结
2018/12/10 Javascript
[37:45]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第二场 12.09
2020/12/11 DOTA
解密Python中的描述符(descriptor)
2015/06/03 Python
python requests.post带head和body的实例
2019/01/02 Python
python实现贪吃蛇游戏
2020/03/21 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
python实现小世界网络生成
2019/11/21 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
百思买加拿大:Best Buy Canada
2018/03/20 全球购物
英国设计的甲板鞋和船鞋:Chatham
2018/12/06 全球购物
NICKIS.com荷兰:设计师儿童时装
2020/01/08 全球购物
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
前厅部经理岗位职责范文
2014/02/04 职场文书
酒店总经理岗位职责
2014/03/17 职场文书
卖车协议书
2014/04/21 职场文书
师德师风学习材料
2014/12/19 职场文书
总经理岗位职责
2015/02/04 职场文书
本溪关门山导游词
2015/02/09 职场文书
python实现Nao机器人的单目测距
2021/09/04 Python