序列图像处理
2015-09-28 22:17:44 hit1524468 阅读数 1333

在基于偏微分方程图像处理领域中,不得不提起全变分偏微分图像去噪/图像修复模型。在详细介绍之前,我们首先介绍一些关于描述图像的函数空间,最开始,人们为了描述图像,认为图像是分片均匀的,这样的图像很简单,例如棋盘图像,很显然,图像并不都是这么简单的,所以,学者们又开始寻找合适的函数空间,继而认为图像可以用几乎处处是一阶连续函数空间进行描述,即,图像允许存在变化,但是,图像函数不能够出现不连续点,这个问题很严重,直接暗示图像中不能够存在“边缘”,好吧,没有边缘的图像在现实生活中也是很少的,从稀疏表示或深度学习的观点来看,这是不合理的,因为人眼在识别物体的时候,边缘是我们最先关注的信息,这也就是为什么在稀疏表示的“原子”中,很大一部分是边缘,所以利用这种方法来描述图像还是不合理;后来,就想出了利用有界变差函数空间来描述图像了,有界变差函数空间中元素(集合的角度)满足这样的性质:几乎处处连续,在包含至多可数个元素(点)的集合上的函数导数的模的总和有限,这样的函数能够很好地描述图像了,即允许图像存在边缘,但是,边缘的导数的模之和有界。然而,利用有界变差函数空间还是对边缘的表示能力较差,所以,引出了利用两个函数空间描述图像的思想,例如利用有界变差函数空间和G空间,又或者利用有界变差函数空间和F/E/H空间等,只是在这里提一下,可能以后会介绍一些利用偏微分方程进行图像分解相关内容介绍。


2015-05-14 10:54:38 hujingshuang 阅读数 13576

前言:本文原发表在新浪博客http://blog.sina.com.cn/s/blog_b27f71160101h5bm.html,现新浪博客将其搬家至CSDN,原新浪博客停止更新。

①申请搬家后,迟迟未能收到申请搬家的码

②再熟悉一下算法

③联系键盘打字

基于以上三点,遂将博文重新敲一遍。


Logistic混沌置乱,先不说有多复杂,其实很简单。

Logistic函数是源于一个人口统计的动力学系统,其系统方程形式如下:

 X(k+1) = u * X(k) * [1 - X(k)],k=0,1,,n

先不用管这个方程是怎么得出来的,觉得不舒服的话自己百度去。可以看出这个方程是非线性的,迭代的形式。要使用的话,我们需要知道两个东西:

    初值:X(0)

    参数:u

为什么这个方程可以称作混沌呢?它什么时候是一个混沌系统呢?这个也是有条件的:

     X(0) < 1

   3.5699456...   u <=4

当满足上述两个条件时,Logistic函数工作于混沌状态。这两个条件是怎么来的请百度,我们这里只说算法和实现。什么是混沌状态:顾名思义就是一种无序的、不可预测的、混乱的、摸不到头、摸不到尾的状态。混沌状态时会出现什么现象,我们以下面的参数为例:

    X(0) = 0.1

    u = 4

当迭代n次后,我们就得到了X(1)、X(2)、…,X(n)这么n个值。那么这就是一个混沌序列,是一维的暂且称作序列A,也就是我们想要得到的序列,在MATLAB中,可以看出X(i)i=1,2,…,n)的取值是在(0,1)之间的——这是一个很好地特性,就像图像灰度值是在(0,255)之间一样。那么我们把这个一维序列归一化到(0,255)之间得到序列B

再来看加密过程。对于一幅M*N大小的图像(暂且称为Picture),我们需要产生一个同样大小的矩阵来对其进行加密。如此说来,只需要迭代M*N次得到序列A,再转成序列B,此时序列B是一维的,将其转化成M*N的二维矩阵(暂且称为Fuck)。因此,用FuckPicutre进行异或,便可得到一幅新的图像,称作Rod,如此便完成了一次图像加密,加密后的图像为Rod

Rod=PictureFuck表示异或

这样我们手中的秘钥是:uX(0)

此种加密方式称作序列加密,可以看出这种加密方式改变了下像素的灰度(直方图变了),没有改变位置。解密同样道理:Picture = RodFuck

代码如下:

%利用Logistic混沌映射,对灰度图像进行序列加密
function v=lock_logistic_gray(picture,x0,u)
[M,N]=size(picture);
x=x0;
%迭代500次,达到充分混沌状态
for i=1:500
    x=u*x*(1-x);
end
%产生一维混沌加密序列
A=zeros(1,M*N);
A(1)=x;
for i=1:M*N-1
A(i+1)=u*A(i)*(1-A(i));
end
%归一化序列
B=uint8(255*A);
%转化为二维混沌加密序列
Fuck=reshape(B,M,N);
Rod=bitxor(picture,Fuck);%异或操作加密
v=Rod;
figure;
imshow([picture,v]);
%完

效果图:

                                                  
加密前                                                                                 加密后

加密前直方图

加密后直方图


2015-09-28 23:05:32 hit1524468 阅读数 1020

前面已经讲过了利用一些函数空间来描述图像,那么,图像自然就可以具有这些函数空间中函数的性质。首先要提的当然是梯度算子(运算),在连续函数中的导数就对应离散图像中的梯度运算,假设F(x,y)为图像对应的属于某一空间的连续函数(至少是几乎处处连续的),I(m,n)表示离散图像,那么可以这样进行理解:

x方向的导数f1(x,y):

f1(x,y) = lim_t (F(x+t,y)  -  F(x,y))/t (t 趋近于0)    <=====>     向前差分格式: I_x (i,j)= I(i+ 1,j) - I(i,j) 

f1(x,y) = lim_t (F(x,y)  -  F(x-t,y))/t (t 趋近于0)    <=====>     向后差分格式: I_x (i,j)=I(i,j) -I(i-1,j)

f1(x,y) = lim_t (F(x+t,y)  -  F(x-t,y))/(2t) (t 趋近于0)    <=====>     中心差分格式: I_x (i,j)= (I(i+1,j) - I(i-1,j)) /2

y方向的导数f2(x,y)类似。

那么,F(x,y)的导数为向量(f1(x,y),f2(x,y))^t,I(m,n)的导数为(I_x(i,j),I_y(i,j))


设g(x,y) = (h(x,y),l(x,y)) 为一个向量函数,即对应每一个(x,y)对应一个向量值,那么

g(x,y)的散度定义如下:

div(g(x,y)) = h1(x,y) + l2(x,y),其中h1为h的x方向导数,l2为l的y方向导数    

那么,离散散度定义为:div((I_x(i,j),I_y(i,j))t) = (I(i+1,j) - I(i,j) - I(i,j)  + I(i-1,j) ) + (I(i,j+1) - I(i,j) - I(i,j) - I(i,j-1),其实这里就是laplace算子了,所以,laplace算子是散度的一种特殊情况,一般情况下,在求一阶导数时用向前差分时,后一步求导就用向后差分,反之亦然。 


2014-06-04 09:55:57 wenyusuran 阅读数 2278
一,将图片序列转化为视频文件
  1. function video=frames2Video(framesPath,videoName,quality,Compressed,fps,startFrame,endFrame)  
  2. %framesPath :图像序列所在路径,同时要保证图像大小相同  
  3. %videoName:  表示将要创建的视频文件的名字  
  4. %quality:    生成视频的质量 0-100  
  5. %Compressed: 压缩类型, 'Indeo3'(默认), 'Indeo5''Cinepak''MSVC''RLE' or 'None'  
  6. %fps: 帧率  
  7. %startFrame ,endFrame ;表示从哪一帧开始,哪一帧结束  
  8.   
  9. if(exist('videoName','file'))  
  10.     delete videoName.avi  
  11. end  
  12.   
  13. %生成视频的参数设定  
  14. aviobj=avifile(videoName);  %创建一个avi视频文件对象,开始时其为空  
  15. aviobj.Quality=quality;  
  16. aviobj.Fps=fps;  
  17. aviobj.compression=Compressed;  
  18.   
  19. %读入图片  
  20. for i=startFrame:endFrame  
  21.     fileName=sprintf('%08d',i);    %根据文件名而定 我这里文件名是00000001.jpg 00000002.jpg ....  
  22.     frames=imread([framesPath,fileName,'.jpg']);  
  23.     aviobj=addframe(aviobj,uint8(frames));  
  24. end  
  25. aviobj=close(aviobj); % 关闭创建视频  
  26. end  
在command window里输入
  1. path='你的文件路径';  
  2. frames2Video(path,'dog',90,'None',5,1,32);  

二,视频文件转化为图片
  1. function avi2Frames(path)  
  2. mov=aviread(path);            
  3. framesNum=size(mov,2);                                             
  4.                                                              
  5.  for i=1:framesNum  
  6.   frames=frame2im(mov(i));                                
  7.   str=strcat('a',int2str(i),'.jpg');                           
  8.   imwrite(frames,str);  
  9.   
  10. end  
  11. end  

代码未做优化,可以先预分配空间同时对于很多使用程序健壮的语句没有加进去
2014-02-26 16:32:00 jxlijunhao 阅读数 3284
将图片序列转化为视频,将视频文件转化为图片
Last Edit 2014/2/26

一,将图片序列转化为视频文件
function video=frames2Video(framesPath,videoName,quality,Compressed,fps,startFrame,endFrame)
%framesPath :图像序列所在路径,同时要保证图像大小相同
%videoName:  表示将要创建的视频文件的名字
%quality:    生成视频的质量 0-100
%Compressed: 压缩类型, 'Indeo3'(默认), 'Indeo5', 'Cinepak', 'MSVC', 'RLE' or 'None'
%fps: 帧率
%startFrame ,endFrame ;表示从哪一帧开始,哪一帧结束

if(exist('videoName','file'))
    delete videoName.avi
end

%生成视频的参数设定
aviobj=avifile(videoName);  %创建一个avi视频文件对象,开始时其为空
aviobj.Quality=quality;
aviobj.Fps=fps;
aviobj.compression=Compressed;

%读入图片
for i=startFrame:endFrame
    fileName=sprintf('%08d',i);    %根据文件名而定 我这里文件名是00000001.jpg 00000002.jpg ....
    frames=imread([framesPath,fileName,'.jpg']);
    aviobj=addframe(aviobj,uint8(frames));
end
aviobj=close(aviobj); % 关闭创建视频
end
在command window里输入
path='你的文件路径';
frames2Video(path,'dog',90,'None',5,1,32);

二,视频文件转化为图片
function avi2Frames(path)
mov=aviread(path);          
framesNum=size(mov,2);                                           
                                                           
 for i=1:framesNum
  frames=frame2im(mov(i));                              
  str=strcat('a',int2str(i),'.jpg');                         
  imwrite(frames,str);

end
end

代码未做优化,可以先预分配空间同时对于很多使用程序健壮的语句没有加进去


没有更多推荐了,返回首页