matlab练习程序(Hilbert图像置乱)

正好刚写了Hibert生成曲线,不如再加一篇应用的程序。

关于Hilbert图像置乱,我在网上搜的应用领域主要集中在数字水印和图像加密上,而这两个领域我都没怎么接触过。

大部分的图像置乱都是如下图的置乱1所示,至于置乱2则是我不小心生成的。

置乱1是先把原图按hilbert曲线进行赋值,拉成一条一维数组,再reshape成一副图像。

置乱2是先把原图reshape成一维数组,然后再按hilbert曲线进行赋值,生成一副图像。

我感觉都差不多,网上置乱1更常见些,置乱2好像就没见过,不过这都算置乱嘛。

也可以先用置乱1生成一副图像,然后把生成的图用置乱2再生成一副图,那就更乱了,不过再乱也都是能够恢复原图的。

原图:

置乱1:

置乱2:

部分函数在上篇,代码如下:

clear all;close all;clc;

h=256;
w=256;
n=8;
img=imread(‘lena.jpg‘);
imshow(img,[])

imgn1=zeros(1,h*w);
imgn2=zeros(h,w);

[x,y]=hilbert(n);
x=floor((x+0.5)*w)+1;
y=floor((y+0.5)*h)+1;

l=length(x);
img2=reshape(img,[1,h*w]);
for i=1:l
    imgn1(i)=img(y(i),x(i));
    imgn2(y(i),x(i))=img2(i);
end

imgn1=reshape(imgn1,[h,w]);

figure;
imshow(imgn1,[]);
figure
imshow(imgn2,[])
时间: 2024-10-11 15:56:33

matlab练习程序(Hilbert图像置乱)的相关文章

【转载】matlab练习程序(图像Haar小波变换)

matlab练习程序(图像Haar小波变换) 关于小波变换我只是有一个很朴素了理解.不过小波变换可以和傅里叶变换结合起来理解. 傅里叶变换是用一系列不同频率的正余弦函数去分解原函数,变换后得到是原函数在正余弦不同频率下的系数. 小波变换使用一系列的不同尺度的小波去分解原函数,变换后得到的是原函数在不同尺度小波下的系数. 不同的小波通过平移与尺度变换分解,平移是为了得到原函数的时间特性,尺度变换是为了得到原函数的频率特性. 小波变换步骤: 1.把小波w(t)和原函数f(t)的开始部分进行比较,计算

matlab练习程序(图像投影到点云)

最近接触点云比较多,如果把图像投影到点云应该挺有意思. 首先需要载入图像,然后做个球或其他什么形状的点云,这里可以参考球坐标公式. 最后通过pcshow将像素输出到点云上即可. 原图: 投影后的点云: 代码如下: clear all; close all; clc; img = imread('lena.jpg'); [m,n,d]=size(img); I=reshape(img,[],d); R=1; x=zeros(m*n,1); y=zeros(m*n,1); z=zeros(m*n,1

matlab练习程序(图像马赛克)

处理原理就是将邻域像素平均值赋给邻域中的所有像素. 这里将处理方法分为了带线条和不带线条,带线条处理后的视觉效果要好些. 原图: 处理结果(不带线条): 处理结果(带线条): 代码处理的是带线条的情况. matlab代码如下: clear all; close all;clc; img=imread('lena.jpg'); imshow(img,[]); [h w]=size(img); imgn=zeros(h,w); n=12; nw=floor(w/n)*n; nh=floor(h/n)

matlab练习程序(Arnold图像置乱)

自从上次写了Hilbert图像置乱之后,就对图像置乱研究了一下,发现这里面也是有很多置乱算法的. Arnold也算一种比较主要的置乱算法,算法由以下变换公式产生: \begin{bmatrix} x_{n+1}\\ y_{n+1} \end{bmatrix} = \begin{bmatrix} 1 & b \a & ab+1 \end{bmatrix} \begin{bmatrix} x_{n} \y_{n} \end{bmatrix} mod(N)" /> 这里a和b是参

matlab练习程序(旋转、径向模糊)

还记得过去写过径向模糊,不过当时效果似乎不好. 这次效果还可以,程序中用的算法是: 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); for y=

(转)matlab练习程序(HOG方向梯度直方图)

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.

matlab练习程序(圆柱投影)

圆柱投影就是将一张二维的图像投影到三维的圆柱体上,不过在显示图像的时候依然是以二维的形式给出. 投影最重要的步骤就是计算投影变换公式,和图像旋转类似,只要得到变换公式,再依照公式进行代码编写就很容易了. 这里就不写投影变换公式的推导过程了,直接给出变换公式.公式分为正变换和反变换,编程时,反变换公式通常更有用. 正变换公式如下: x'=f\cdot\arctan\left({\frac{x-\frac{W}{2}}{f}}\right)+f\cdot\arctan\left({\frac{W}{

matlab练习程序(弧形、圆柱投影的复原)

前一段介绍了从矩形图像到圆柱的正向投影,看这里和这里.今天介绍如何从已经投影的图像反映射到原图像上. 本来此种变换一定是需要数学公式的,不过这里只是用了一个很简单的方式来完成反映射. 具体就把每一列有像素数据的长度拉伸到原图像的高就行了. 原图像是这样: 处理后: 看着感觉还可以,不过这样显然是不合数学公式的,和最原始的图比较一下就看出来差别了: matlab代码如下: clear all;close all;clc; img=imread('re.bmp'); [h w]=size(img);

matlab练习程序(生成黑白网格)

提供了两种生成方法,一个是自己编程实现,比较灵活:另一个是调用系统的checkerboard函数,似乎只能生成8*8网格. 至于用途,也许可以用来下国际象棋. 自己函数生成: 系统函数生成: 代码如下: clear all;close all;clc h=256; w=256; n=8; img=zeros(h,w); flag=1; for y=1:h for x=1:w if flag>0 img(y,x)=255; end if mod(x,int8(w/n))==0 flag=-flag