PS 滤镜算法原理——拼贴
%%%% Tile
%%%%% 实现拼贴效果
%%%%% 将原图像进行分块,然后让图像块在
%%%%% 新图像范围内进行随机移动,确定移动后的边界
%%%%% 将移动后的图像块填入新图像内
clc;
clear all;
close all;
Image=imread('4.jpg');
Image1=double(Image);
Image2=Image1;
Image2(:,:,1)=0;
Image2(:,:,2)=0;
Image2(:,:,3)=0;
%%%% 块数 (1-99)
N=8;
%%%% 错开距离的最大百分比(0.01-0.99)
Percent=0.25;
Size_Info=size(Image);
%%% 确定图像的长和宽
Height=Size_Info(1);
Width=Size_Info(2);
%%% 确定图像的分块大小,及错开的最大距离
Min_value=min(Width,Height);
Block_size=floor(Min_value/N);
Rand_Dist=max(Block_size*Percent,2);
%%% 确定图像在长和宽方向的块数
N_row=floor(Height/Block_size);
N_col=floor(Width/Block_size);
Block_height=0;
Block_width=0;
%%% 图像如果在长或宽方向有多余的,统计在内
if(N_row*Block_size<Height)
Block_height=(Height-Block_size*N_row)/2;
N_row=N_row+1;
end
if(N_col*Block_size<Width)
Block_width=(Width-Block_size*N_col)/2;
N_col=N_col+1;
end
First_value=(Block_size+1)/2;
%%% 图像块原始坐标
Row_coordinate_origin(1:N_row)=0;
Col_coordinate_origin(1:N_col)=0;
for i=1:N_row-1;
Row_coordinate_origin(i)=round(First_value+(i-1)*Block_size);
end
Row_coordinate_origin(N_row)=round((Height+(N_row-1)*Block_size)/2);
for i=1:N_col-1
Col_coordinate_origin(i)=round(First_value+(i-1)*Block_size);
end
Col_coordinate_origin(N_col)=round((Width+(N_col-1)*Block_size)/2);
%%% 图像块的错开后的坐标
Row_coordinate(1:N_row,1:N_col)=0;
Col_coordinate(1:N_row,1:N_col)=0;
for i=1:N_row;
for j=1:N_col
Row_coordinate(i,j)=Row_coordinate_origin(i)+floor(Rand_Dist*2*(rand()-0.5));
end
end
for i=1:N_row
for j=1:N_col
Col_coordinate(i,j)=Col_coordinate_origin(j)+floor(Rand_Dist*2*(rand()-0.5));
end
end
%%% 对图像进行拼贴处理
Block_half=(Block_size-1)/2;
for i=1:N_row
for j=1:N_col
%%% 首先确定错开后的坐标没有越界
if(Row_coordinate(i,j)>Height || Col_coordinate(i,j)>Width)
continue;
end
%%% 将图像块分成四部分,从图像的中心向四条边进行搜索
%%% 计算图像块四个方向的边界
%%% 计算图像块上边界
if(Row_coordinate(i,j)-Block_half<1)
Block_h_down=Row_coordinate(i,j)-1;
row_down=1;
row_down_origin=Row_coordinate_origin(i)-Block_h_down;
else
row_down=round(Row_coordinate(i,j)-Block_half);
row_down_origin=round(Row_coordinate_origin(i)-Block_half);
end
%%% 计算图像块的下边界
if(Row_coordinate(i,j)+Block_half>Height)
Block_h_up=Height-Row_coordinate(i,j);
row_up=Height;
row_up_origin=Row_coordinate_origin(i)+Block_h_up;
else
row_up=round(Row_coordinate(i,j)+Block_half);
row_up_origin=round(Row_coordinate_origin(i)+Block_half);
end
%%% 如果最下面的图像块比标准的要小,单独计算
%%% 多出的一部分的下边界
if(i==N_row && Block_height~=0)
if(Row_coordinate(i,j)+Block_height>Height)
Block_h_up=Height-Row_coordinate(i,j);
row_up=Height;
row_up_origin=Row_coordinate_origin(i)+Block_h_up;
else
row_up=floor(Row_coordinate(i,j)+Block_height);
row_up_origin=floor(Row_coordinate_origin(i)+Block_height);
end
end
%%% 计算图像的左边界
if(Col_coordinate(i,j)-Block_half<1)
Block_w_down=Col_coordinate(i,j)-1;
col_down=1;
col_down_origin=Col_coordinate_origin(j)-Block_w_down;
else
col_down=round(Col_coordinate(i,j)-Block_half);
col_down_origin=round(Col_coordinate_origin(j)-Block_half);
end
%%计算图像的右边界
if(Col_coordinate(i,j)+Block_half>Width)
Block_w_up=Width-Col_coordinate(i,j);
col_up=Width;
col_up_origin=Col_coordinate_origin(j)+Block_w_up;
else
col_up=round(Col_coordinate(i,j)+Block_half);
col_up_origin=round(Col_coordinate_origin(j)+Block_half);
end
%%% 如果最右边的图像块比标准的要小,单独计算
%%% 多出的一部分的右边界
if(j==N_col && Block_width~=0)
if(Col_coordinate(i,j)+Block_width>Width)
Block_w_up=Width-Col_coordinate(i,j);
col_up=Width;
col_up_origin=Col_coordinate_origin(j)+Block_w_up;
else
col_up=floor(Col_coordinate(i,j)+Block_width);
col_up_origin=floor(Col_coordinate_origin(j)+Block_width);
end
end
Image2(row_down:row_up,col_down:col_up,:) = ...
Image(row_down_origin:row_up_origin,col_down_origin:col_up_origin,:);
end
end
imshow(Image2/255);
原图:
效果图:
PS 滤镜算法原理——拼贴的更多相关文章
- PS 滤镜算法原理——照亮边缘
这个算法原理很简单,对彩色图像的R,G,B 三个通道,分别求梯度,然后将梯度值作为三个通道的值. clc; clear all;Image=imread('4.jpg');Image=double(I ...
- PS 滤镜算法原理——染色玻璃
%%%% 完成PS 中的染色玻璃滤镜特效 clc; clear all; close all; Image=imread('4.jpg'); Image=double(Image); Gray_Ima ...
- PS 滤镜算法原理——曝光过度
这个算法的原理,就是将图像反相,然后分别比较原图与反相后的图三个通道的大小,将小的值输出. clc; clear all; Image=imread('4.jpg'); Image=double(Im ...
- PS 滤镜算法原理 ——马赛克
% method : 利用邻域的随意一点取代当前邻域全部像素点 %%%% mosaic clc; clear all; addpath('E:\PhotoShop Algortihm\Image Pr ...
- PS 滤镜算法原理——碎片效果
%%% Fragment %%% 对原图做四个方向的平移,然后对平移的结果取平均 %%% 碎片效果 clc; clear all; Image=imread('4.jpg'); Image=doubl ...
- PS 滤镜算法原理——高反差保留 (High Pass)
这个特效简单来说,就是一个高通滤波器, 对图像做高斯滤波,用原图减去高斯滤波后的图,再将差值加上128. clc; clear all; close all; Image=imread('4.jpg' ...
- PS 滤镜算法原理——浮雕效果
clc; clear all; Image=imread('4.jpg');Image=double(Image);p=3; %% 控制浮雕的强度 %% 控制浮雕的方向 H=[0 0 p ...
- PS 滤镜算法— — 表面模糊
图像的表面模糊处理,其作用是在保留图像边缘的情况下,对图像的表面进行模糊处理.在对人物皮肤处理上,比高斯模糊更有效.因为高斯模糊在使人物皮肤光洁的同时,也将一些边缘特征如脸部的眉毛.嘴唇等给模糊了,不 ...
- OpenCV——PS 滤镜算法之极坐标变换到平面坐标
// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...
随机推荐
- K均值聚类的失效性分析
K均值聚类是一种应用广泛的聚类技术,特别是它不依赖于任何对数据所做的假设,比如说,给定一个数据集合及对应的类数目,就可以运用K均值方法,通过最小化均方误差,来进行聚类分析. 因此,K均值实际上是一个最 ...
- python地理数据处理库geopy
http://blog.csdn.net/pipisorry/article/details/52205266 python地理位置处理 python地理编码地址以及用来处理经纬度的库 GeoDjan ...
- Makefile自动生成:cmake
http://blog.csdn.net/pipisorry/article/details/51647073 编辑makefile文件CMakeLists.txt,使用cmake命令自动生成make ...
- bash与ksh数组使用
区别: bash与ksh在数组的使用中,最大的不同在于数组的定义. bash: declare -a arrayname ksh:set -A arrayname 其实,数组不用非要定义,在赋值的时候 ...
- java的overload与override
概括 方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现.重写(Overriding)是父类与子类之间多态性的一种表现,而重载(Overloading)是一个 ...
- Java程序员的必备知识-类加载机制详解
类加载器的概念 类加载器是一个用来加载类文件的类. Java源代码通过javac编译器编译成类文件.然后JVM来执行类文件中的字节码来执行程序.类加载器负责加载文件系统.网络或其他来源的类文件. JV ...
- 【java集合框架源码剖析系列】java源码剖析之TreeSet
本博客将从源码的角度带领大家学习TreeSet相关的知识. 一TreeSet类的定义: public class TreeSet<E> extends AbstractSet<E&g ...
- 手动开发动态资源之servlet初步
1.1 静态资源和动态资源的区别 静态资源:当用户多次访问这个资源,资源的源代码永远不会改变的资源. 动态资源:当用户多次访问这个资源,资源的源代码可能会发送改变. 1.2动态资源的开发技术 Serv ...
- 北大青鸟Asp.net之颗粒归仓
自从小编走进编程的世界以来,学习的编程知识都是和C/S这个小伙伴握手,直到做完牛腩老师的新闻发布系统,才开始了小编的B/S学习生涯,和B/S初次谋面,小宇宙瞬间爆发了,看着自己的第一个B/S系统,牛腩 ...
- CentOS 64-bit下安装JDK和Tomcat并设置Tomcat开机启动操作步骤
准备文件如下: 1.CentOS-6.4-x86_64-bin-DVD1.iso 2.jdk-7u67-linux-x64.rpm 3.apache-tomcat-7.0.55.tar.gz 安装步骤 ...