%%%% 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 滤镜算法原理——拼贴的更多相关文章

  1. PS 滤镜算法原理——照亮边缘

    这个算法原理很简单,对彩色图像的R,G,B 三个通道,分别求梯度,然后将梯度值作为三个通道的值. clc; clear all;Image=imread('4.jpg');Image=double(I ...

  2. PS 滤镜算法原理——染色玻璃

    %%%% 完成PS 中的染色玻璃滤镜特效 clc; clear all; close all; Image=imread('4.jpg'); Image=double(Image); Gray_Ima ...

  3. PS 滤镜算法原理——曝光过度

    这个算法的原理,就是将图像反相,然后分别比较原图与反相后的图三个通道的大小,将小的值输出. clc; clear all; Image=imread('4.jpg'); Image=double(Im ...

  4. PS 滤镜算法原理 ——马赛克

    % method : 利用邻域的随意一点取代当前邻域全部像素点 %%%% mosaic clc; clear all; addpath('E:\PhotoShop Algortihm\Image Pr ...

  5. PS 滤镜算法原理——碎片效果

    %%% Fragment %%% 对原图做四个方向的平移,然后对平移的结果取平均 %%% 碎片效果 clc; clear all; Image=imread('4.jpg'); Image=doubl ...

  6. PS 滤镜算法原理——高反差保留 (High Pass)

    这个特效简单来说,就是一个高通滤波器, 对图像做高斯滤波,用原图减去高斯滤波后的图,再将差值加上128. clc; clear all; close all; Image=imread('4.jpg' ...

  7. PS 滤镜算法原理——浮雕效果

    clc; clear all; Image=imread('4.jpg');Image=double(Image);p=3;  %% 控制浮雕的强度 %% 控制浮雕的方向 H=[0 0 p      ...

  8. PS 滤镜算法— — 表面模糊

    图像的表面模糊处理,其作用是在保留图像边缘的情况下,对图像的表面进行模糊处理.在对人物皮肤处理上,比高斯模糊更有效.因为高斯模糊在使人物皮肤光洁的同时,也将一些边缘特征如脸部的眉毛.嘴唇等给模糊了,不 ...

  9. OpenCV——PS 滤镜算法之极坐标变换到平面坐标

    // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...

随机推荐

  1. Android Multimedia框架总结(九)Stagefright框架之数据处理及到OMXCodec过程

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼:http://blog.csdn.net/hejjunlin/article/details/52532085 不知不觉到第九篇了,感觉还有 ...

  2. 百度map 3.0初探

    1.简介 在使用百度地图SDK为您提供的各种LBS能力之前,您需要获取百度地图移动版的开发密钥,该密钥与您的百度账户相关联.因此,您必须先有百度帐户,才能获得开发密钥.并且,该密钥与您创建的过程名称有 ...

  3. java虚拟机参数设置 jvm参数设置

    java进程命令行使用方式如下: java [-options] class [args...] -options 表示虚拟机的启动参数, class为带有main()函数的java类的全名称 arg ...

  4. Storm 0.9安装指南

    Storm 0.9.2安装指南 0 Storm0.9的亮点 引用网上的描述: "Storm 0.9.0.1版本的第一亮点是引入了netty transport.Storm网络传输机制实现可插 ...

  5. Java并发框架——AQS阻塞队列管理(二)——自旋锁优化

    看Craig, Landin, and Hagersten发明的CLH锁如何优化同步带来的花销,其核心思想是:通过一定手段将所有线程对某一共享变量轮询竞争转化为一个线程队列且队列中的线程各自轮询自己的 ...

  6. shell入门之变量测试

    格式:test 测试条件 字符串测试: 注意空格: test str1 == str2 测试字符串是否相等 test str1 != str2 测试字符串是否不相等 test str1 测试字符串是否 ...

  7. 精通CSS+DIV网页样式与布局--页面和浏览器元素

    在页面和浏览器中,除了文字.图片.表格.表单等,还有很多各种各样的元素,在上篇博文中,小编主要简单的介绍了一下在CSS中如何设置表格和表单,今天小编主要简单介绍一下丰富的超链接特效.鼠标特效.页面滚动 ...

  8. 【Unity技巧】制作一个简单的NPC

    1. 写在前面 前几天看了cgcookie的一个教程,学习了下怎么根据已有人物模型制作一个仿版的NPC人物,感觉挺好玩的,整理一下放到博客里! 先看一下教程里面的最终效果. 是不是很像个幽灵~ 下面是 ...

  9. Git版本控制:Git高级教程

    http://blog.csdn.net/pipisorry/article/details/50669350 Git有很多命令行参数,使用起来非常方便.可以运行 man git log ,来看一下这 ...

  10. moonmq: 用go实现的高性能message queue

    介绍 moonmq是一个用go实现的高性能消息队列系统,后续准备用于我们消息推送服务以及各个后台的异步任务. 在设计上面,moonmq主要借鉴了rabbitmq以及rocketmq相关的思想,但是做了 ...