matlab练习程序(Arnold图像置乱)】的更多相关文章

自从上次写了Hilbert图像置乱之后,就对图像置乱研究了一下,发现这里面也是有很多置乱算法的. Arnold也算一种比较主要的置乱算法,算法由以下变换公式产生: 这里a和b是参数,n是迭代次数,N是图像的高或宽. 有了正变换公式,我们还需要反变换公式,正好我最近在学Mathematica,反变换公式就是用这个软件求的. 公式如下: 两个变换矩阵正好是求逆的关系吧,手算也出来了,不过顺便熟悉一下Mathematica,何乐不为呢. 处理结果如下: 原图: 置乱后: 恢复后: matlab代码如下…
十一没什么事干,接着看图像算法. 这个球面化算法最初是在ps上的球面化滤镜中看到的,感觉挺有意思,就研究了一下. 算法的详细推导可以在这篇博客中找到,我比较懒,只在纸上推了一遍,就不在博客上编辑了. 不过这里还是要把逆变换公式写一下. 公式如下: 其中R为球的半径,x,y为目标图像像素坐标,xx,yy为源图像像素坐标. 原图: 球面化后: matlab代码如下: clear all;close all;clc; img=imread('lena.jpg'); [h w]=size(img); i…
最近接触点云比较多,如果把图像投影到点云应该挺有意思. 首先需要载入图像,然后做个球或其他什么形状的点云,这里可以参考球坐标公式. 最后通过pcshow将像素输出到点云上即可. 原图: 投影后的点云: 代码如下: clear all; close all; clc; img = imread('lena.jpg'); [m,n,d]=size(img); I=reshape(img,[],d); R=; x=zeros(m*n,); y=zeros(m*n,); z=zeros(m*n,); n…
处理原理就是将邻域像素平均值赋给邻域中的所有像素. 这里将处理方法分为了带线条和不带线条,带线条处理后的视觉效果要好些. 原图: 处理结果(不带线条): 处理结果(带线条): 代码处理的是带线条的情况. matlab代码如下: clear all; close all;clc; img=imread('lena.jpg'); imshow(img,[]); [h w]=size(img); imgn=zeros(h,w); n=; nw=floor(w/n)*n; nh=floor(h/n)*n…
正好刚写了Hibert生成曲线,不如再加一篇应用的程序. 关于Hilbert图像置乱,我在网上搜的应用领域主要集中在数字水印和图像加密上,而这两个领域我都没怎么接触过. 大部分的图像置乱都是如下图的置乱1所示,至于置乱2则是我不小心生成的. 置乱1是先把原图按hilbert曲线进行赋值,拉成一条一维数组,再reshape成一副图像. 置乱2是先把原图reshape成一维数组,然后再按hilbert曲线进行赋值,生成一副图像. 我感觉都差不多,网上置乱1更常见些,置乱2好像就没见过,不过这都算置乱…
matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像等大的目标图像.然后用一个圆形的模板,用模板去遍历原图像每个像素,把模板内的每个像素都和模板中心像素比较,如果灰度小于一个阈值,那么就对目标图像当前和原图像相同位置的像素加一,直到结束.目标图像中在原图像是角点的位置就会取局部极小,所以做一个反向的相减.img=max(img)-img,if img…
matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram of Oriented Gradient)方向梯度直方图,主要用来提取图像特征,最常用的是结合svm进行行人检测. 算法流程图如下(这篇论文上的): 下面我再结合自己的程序,表述一遍吧: 1.对原图像gamma校正,img=sqrt(img); 2.求图像竖直边缘,水平边缘,边缘强度,边缘斜率. 3.…
(一)图像几何变换理论知识 (1)图像的平移与比例 图像的平移很简单,平移前后的坐标分别为(x,y)和(x',y'),则满足的关系式为 x'= x +Tx: y'= y +Ty: 其中Tx与Ty分别为对应的偏移量. 图像的比例也很简单,可以描述为:x'=S_x * x;  y'=S_y * y; 那么上述的关系怎么用一个矩阵来表示呢?一个很重要的矩阵来了,那就是变换矩阵T,并且对于二维坐标下的点,一般转化为笛卡尔坐标系下进行计算,用一个三维点表示二维的,只不过把最后一项值置为1,这样一个二维坐标…
随机游走类似布朗运动,就是随机的向各个方向走吧. 虽然代码没什么技术含量,不过产生的图像实在太漂亮了,所以还是贴上来吧. 产生的图像: matlab代码如下: clear all;close all;clc n=; %游走的步数.也是图像中像素个数,有些位置可能重复,所以白像素小于等于n x=; %初始x坐标 y=; %初始y坐标 pix=zeros(n,); %游走产生的像素坐标 neighbour=[- -;- ;- ; -; ; -; ; ]; %当前像素邻域 :n r=floor(+*r…
介绍一下奇异值分解来压缩图像.今年的上半年中的一篇博客贴了一篇用奇异值分解处理pca问题的程序,当时用的是图像序列,是把图像序列中的不同部分分离开来.这里是用的不是图像序列了,只是单单的一幅图像,所以直接就对图像矩阵进行svd了. 吴军的<数学之美>里其实已经介绍过用svd进行大数据的压缩了,不过我这里还是针对图像进行介绍一下吧.比如一幅1000*1000的图像A,存储就需要1000000个像素了.我们对A进行svd分解,则A=USV’,如果rank(A)=r,那么U就为1000*r的矩阵,S…
比如有图像1,将其旋转n度得到图像2,问如何比较两张图像得到旋转的度数n. 算法思路参考logpolar变换: 1.从图像中心位置向四周引出射线. 2.计算每根射线所打到图像上的像素累计和,得到极坐标灰度曲线. 3.比较两张图的灰度曲线,得到最相关的偏移位置,即为两张图像的旋转角度. 原图: 旋转了10°的图像: 灰度曲线: 代码如下: main.m clear all; close all; clc; img1 = imread('lena.jpg'); img2 = imrotate(img…
静止背景下的卡尔曼多目标跟踪 最近学习了一下多目标跟踪,看了看MathWorks的关于Motion-Based Multiple Object Tracking的Documention. 官网链接:http://cn.mathworks.com/help/vision/examples/motion-based-multiple-object-tracking.html?s_tid=gn_loc_drop 程序来自matlab的CV工具箱Computer Vision System Toolbo…
本练习程序是受到了这个老外博文的启发,感觉挺有意思,就尝试了一下.他用的是opencv,我这里用的是matlab. 过去写过透视投影,当时是用来做倾斜校正的,这次同样用到了透视投影,不过更有意思,是将一张图像贴到另一张图像上. 两个透视投影都需要先计算投影矩阵,倾斜校正那一篇是通过解线性方程组求的变换矩阵,而这一篇是通过奇异值分解求的变换矩阵. 为了对齐两张图像,还需要对投影后的图像做一次仿射变换,其实就是坐标平移. 这里做投影和仿射直接调用了matlab的系统函数,方便一些. 还是先介绍下如何…
变换使用的模板必须是单连通的,而且模板中心必须在模板内,如果在模板中打个结或是月牙形,这里的程序就处理不了了. 虽然非单连通模板也有办法处理,不过不是这里要讨论的. 这里用到的方法和矩形变换为圆那片文章中用的方法几乎一样,变换前后像素按比例缩减,不过在判断弧度和图像边界到模板中心距离时略有不同. 变换为圆时弧度可以直接计算出来,而变换为任意形状只能算出一个最小相似值. 至于图像边界到模板中心距离只能分八种情况判断了,处理圆时可以根据对称性简化程序,这里似乎没有什么好办法简化. 变换细节上,那篇文…
这里我用的空间是x向右为正,y向下为正,z向屏幕里面为正.相当于标准右手系绕x轴旋转了180度. 将三个点光源放在 r = [0.3,0,0.5];g = [0.3,-0.5*cos(pi/6),-0.5*sin(pi/6)];b = [0.3,0.5*cos(pi/6),-0.5*sin(pi/6)]; 这三个位置上,向四周发射光线,取光线到y-z平面的模的倒数作为光的强度. 图像如下: 程序如下:   clear all; close all; clc; r = [0.3,0,0.5]; g…
能够使用这样一条线遍历图像中所有的像素,不过这里没有这样做,而只是生成了这样一条曲线. 程序中h,w是最终图像的高和宽,n为希尔伯特曲线阶数. 这里如果n等于log2(h)或log2(w),则图像就全为白了,也算是正好遍历所有像素了. 当然,n很大的话,图像也是全为白的,不过,那样不算正好遍历吧. 代码中生成曲线的核心函数可以在这里找到. 生成图像如下: matlab代码如下: main.m clear all;close all;clc; h=; w=; n=; imgn=zeros(h,w)…
我只是感觉好玩,写了这样一段程序. 原理就是先随机生成两个点,然后根据这两个点画直线,最后在直线上的像素保留,没在直线上的像素丢弃就行了. 最后生成了一幅含有很多空洞的图像. 当然,对含有空洞的图像是可以用修复算法修复的. 我也尝试修复了一下,用的算法我过去也写过,可以看这里. 这一次就不贴修复代码了,那段程序中的输入图像img.mask和这里的输出图像img.mask是一模一样的. 原图: 采样后: 修复后: matlab代码如下: main.m: clear all; close all;c…
还记得过去写过径向模糊,不过当时效果似乎不好. 这次效果还可以,程序中用的算法是: 1.求当前处理点和图像中心点之间的距离r与角度ang; 2.通过对r的修改得到径向模糊. 3.通过对ang的修改得到旋转模糊. 一看代码就能全部明白,不仔细解释了. 原图如下: 处理后效果: matlab代码如下: clear all;close all;clc img=imread('lena.jpg'); [h w]=size(img); imshow(img) imgn=zeros(h,w); :h :w…
圆柱投影就是将一张二维的图像投影到三维的圆柱体上,不过在显示图像的时候依然是以二维的形式给出. 投影最重要的步骤就是计算投影变换公式,和图像旋转类似,只要得到变换公式,再依照公式进行代码编写就很容易了. 这里就不写投影变换公式的推导过程了,直接给出变换公式.公式分为正变换和反变换,编程时,反变换公式通常更有用. 正变换公式如下: 其中,x,y为原图的坐标,x',y'为变换后图像的坐标,W,H为原图的宽和高,f=W/(2*tan(hfOV/2)),这里hfOV为相机水平视角,我们通过设置这个参数来…
这个程序我最初是用FreeImage写的,这两天改成了matlab,再不贴上来,我就要忘了. 看到一篇文章有这样的变换,挺有意思的,就拿来试了一下,文章点此. 全景图到穹顶图变换,通俗的说就是将全景图首尾相接做成一个圆环的样子. 先看下面这张图: 下面的矩形就是我们要处理的全景图,上面的矩形是变换后的图像.下面图像的底边对应穹顶图的内圆,顶边对应穹顶图的外圆,当然,反过来也是可以的. 程序流程: 1.定义穹顶图内圆和外圆的半径,变换后的像素就填充在这个内外半径的圆环中. 2.遍历穹顶图,当所处理…
图的相关算法也算是自己的一个软肋了,当年没选修图论也是一大遗憾. 图像处理中,也有使用图论算法作为基础的相关算法,比如图割,这个算法就需要求最大流.最小割.所以熟悉一下图论算法对于图像处理还是很有帮助的. Dijkstra和Bellman-Ford类似,都是解决单源最短路径问题,不同的是这个方法只能解决边为非负的问题,实现的好的Dijkstra算法运行时间要快于Bellman-ford. 算法步骤如下: 1.首先设置队列,所有节点入列,源节点值为0,其他节点值为无穷. 2.然后在队列中找值最小的…
http://www.cnblogs.com/tiandsp/archive/2013/04/18/3029468.html 主要是用来平滑图像的,克服了高斯模糊的缺陷,各向异性扩散在平滑图像时是保留图像边缘的(和双边滤波很像). 通常我们有将图像看作矩阵的,看作图的,看作随机过程的,记得过去还有看作力场的. 这次新鲜,将图像看作热量场了.每个像素看作热流,根据当前像素和周围像素的关系,来确定是否要向周围扩散.比如某个邻域像素和当前像素差别较大,则代表这个邻域像素很可能是个边界,那么当前像素就不…
这个算法是对photoshop中滤镜->像素化->碎片这个功能的学习. PS这个功能好像不带参数,不过我这里有滤波半径r可以进行控制. 因为我是看效果猜算法的,效果肯定有所区别. 我的想法是对图像以r为长度,在上下左右四个方向做位移,然后进行混合. 代码还是很简单,就不详细介绍了. 处理效果如下: 原图: 处理后效果: PS碎片效果: matlab代码如下: clear all;close all;clc img=double(imread('lena.jpg')); [h w]=size(i…
我手机上有一个软件实现了很多图像滤镜,挺有意思,我打算都尝试一下. 这个滤镜主要是实现老照片效果. 代码很短,我就不详细介绍了. 原图: 处理后效果: matlab代码如下: clear all;close all;clc; img=imread('lena_rgb.jpg'); [h w k]=size(img); imshow(img); R=double(img(:,:,)); G=double(img(:,:,)); B=double(img(:,:,)); rR=R*0.393+G*0…
这个算子算是图像历史上第一个特征点提取算法了,1977年提出的,很简单,拿来练手很合适. 算法原理如下: 1.选取一个合理的邻域遍历图像,这里是5*5邻域的.在邻域中依次计算,垂直,水平,对角与反对角四个相邻像素灰度的差的平方和,作为该邻域特征值. 大致就是下面这个样子: 公式: 这里k是窗口的半径. 2.从四个特征值中选最小的值作为该像素初次候选特征值. 公式: 3.设定一个阈值,将大于该阈值初次候选特征值的选为二次候选特征值. 4.设定一个邻域,将该邻域最大的二次候选特征值作为最终要选择的特…
最近总是对计算几何方面的程序比较感兴趣. 多圆求交点,要先对圆两两求交点. 有交点的圆分为相切圆和相交圆. 相切圆求法: 1.根据两圆心求直线 2.求公共弦直线方程 3.求两直线交点即两圆切点. 相交圆求法: 1.求公共弦方程直线. 2.公共弦直线方程和其中一个圆方程联立求解即可. 公共弦直线方程就是两圆方程的差. 结果如下: matlab代码如下: main.m: clear all;close all;clc; n=; cic=rand(n,); %(x,y,r) hold on; :n-…
还记得原来写过一个对图像进行波纹扭曲操作的博文. 这次实现的是水波特效,其实就是通过正余弦函数表示波纹中心位置慢慢向外扩散,通过叠加衰减因子使振幅不断减小,进而产生水波的效果. 效果如下: 原图: 波纹特效: matlab代码如下:   clear all; close all; clc; cenH=128; %波纹中心 cenW=128; R=80; %扩散半径 amplitude =3; %幅度 wavelength=30; %波长 phase =20; %相位 img = double(i…
转自 http://www.cnblogs.com/tiandsp/archive/2012/01/07/2316006.html  感谢Dsp tian clearclc;img = imread('124.jpg');     % Read image from graphics file [m n t] = size(img);            % 获取图型大小   max = 0;min = 256;avg = 0;for i =1:1:m    for j = 1:1:n    …
最近对图像坐标的变换很感兴趣啊,这次是将一张图像变换为圆形. 变换原理就是按变换前后像素到圆心的距离按比例缩减就行了. 改变x,y方向上的系数,应该还可以变换为椭圆,不过我还没有尝试. 注意我这里相当于缩小图像了,所以用的是正向插值,如果想生成一个大圆,还是需要逆向插值的. 原图如下: 处理后效果: matlab代码如下: clear all;close all;clc; img=imread('lena.jpg'); [h w]=size(img); imshow(img); imgn=zer…
前一段介绍了从矩形图像到圆柱的正向投影,看这里和这里.今天介绍如何从已经投影的图像反映射到原图像上. 本来此种变换一定是需要数学公式的,不过这里只是用了一个很简单的方式来完成反映射. 具体就把每一列有像素数据的长度拉伸到原图像的高就行了. 原图像是这样: 处理后: 看着感觉还可以,不过这样显然是不合数学公式的,和最原始的图比较一下就看出来差别了: matlab代码如下: clear all;close all;clc; img=imread('re.bmp'); [h w]=size(img);…