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 < ... 
随机推荐
- Spark技术内幕: Shuffle详解(三)
			前两篇文章写了Shuffle Read的一些实现细节.但是要想彻底理清楚这里边的实现逻辑,还是需要更多篇幅的:本篇开始,将按照Job的执行顺序,来讲解Shuffle.即,结果数据(ShuffleMap ... 
- Android核心安全机制(一)
			Android六种核心安全机制-加密.密钥.签名与证书 对于移动开发,程序猿很容易会忘记一些安全问题,如一个MD5的加密,大部分人都知道怎么去使用,但是其中的一些加密原理,加密方式却只有少部分会去了解 ... 
- 菜鸟学习物联网---辨析基于Andriod 5.1,Linux,Windows10开发Dragon Board 410c板
			点击打开链接 诸位亲最近怎么样?刚过完年上班是不是很不情愿?自古做事者,不唯有坚韧不拔之志,亦或有超世之才.所以,诸位好好加油.今天小编想给大家系统性总结一下Dragon Board 410c板基于A ... 
- NET中小型企业级项目开发架构系列(一)
			前端时间我们开发了基于Net的一套搭建sprint.NET+NHibernate+MVC+WCF+EasyUI等中小型企业级系统开发平台,现在把整个开发过程中的步步进展整理出来和大家分享,这个系列可能 ... 
- Dynamics Crm 2011 Or 2013 IFD 部署一段时间后,CA验证问题
			以下错误描述摘自博客:http://blog.csdn.net/qzw4549689/article/details/14451257 IFD部署一段时间后,大概一年,突然出现从IFD登录页面登录后, ... 
- 创建银行API
			DECLARE lc_output VARCHAR2(3000); lc_msg_dummy VARCHAR2(3000); lc_return_status VARCHAR2(3000); lc_m ... 
- 无刷新更新listview
			闲来无事,写点水文吧!有用得着的可以参考下,无刷新更新listview是什么意思呢?举个例子,在订单类listview列表中,常常会有各种订单状态,拿商城类app来说,会有待付款,待收货,确认收货等等 ... 
- 安卓java.lang.IllegalArgumentException: The observer is null.解决方案
			刚刚在调试自己的APP项目的时候报错java.lang.IllegalArgumentException: The observer is null.,而之前是可以运行通过,所以百思不得其解,后来在网 ... 
- 《java入门第一季》之网络编程初探
			由于在写有关javaweb的博客,在写到web服务器的时候需要回顾网络编程的知识,提前把网络编程放在前面写. 直接上代码解释: import java.net.InetAddress; import ... 
- 设计比较好,有助于学习的Github上的iOS App源码 (中文)
			Github版 中文 : TeamTalk 蘑菇街. 开源IM. 电商强烈推荐. MyOne-iOS 用OC写的<一个> iOS 客户端 zhihuDaily 高仿知乎日报 Coding ... 
