您的位置:首页 > 其它

图像置乱之评价图像置乱度算法的选择

2016-07-23 15:40 531 查看
一、图像置乱度

所谓“图像置乱”,就是将图像的信息次序打乱,将a像素移动到b像素的位置上,b像素移动到c像素的位置上……使其变换成杂乱无章难以辨认的图像。

目前对于置乱的研究主要集中在置乱方法和置乱度评价两个方面。在置乱方法研究方面已取得了一定成效,同时也在探索更为简单、有效、安全、适用于任何图像( 不同大小,彩色和灰度) 的置乱方法。笔者在做关于图像置乱的过程中通过查阅文献找到了一个比较合理的图像置乱度评价方法,在使用过程中发现符合一般逻辑规律,即对于一幅图像置乱次数越多则其置乱度越大,此种方法符合这个规律。

二、方法核心思想

该方法认为图像像素之间具有一定相关性,在置乱过程中其像素位置被打乱,其相关性会降低,则可以利用这一点来评价图像置乱度,具体做法是将图像分成M X N 块,计算每一块像素的均值,接着计算这些像素均值的方差E,分别计算出原始图像的方差Eorg,再接着计算置乱后的方差Eden,这样置乱度S为:S = 1 - Eden / Eorg。

三、程序实现

用C语言实现了这个评价算法,具体代码如下:

@浪子帅哥
//计算置乱度函数, BlockSize为分块大小
double ScramblingDegree(int **imgdata)
{
//计算分块数
int SplRows, SplCols, len = 0;
if((deminfo.nrows % BlockSize) > 0)
{
SplRows = deminfo.nrows / BlockSize + 1;
}
if((deminfo.ncols % BlockSize) > 0)
{
SplCols = deminfo.ncols / BlockSize + 1;
}
//计算分块高程均值,存入Block数组
int BlockNum = (SplRows * SplCols);
double *Block;
double Block_FC = 0, Sum = 0;
Block = (double*)malloc(BlockNum * sizeof(double));
for(int m = 0; m < SplRows; m++)
{
for(int n = 0; n < SplCols; n++)
{
int count = 0;
for(int i = (deminfo.nrows -1) - (BlockSize) * m; i > (deminfo.nrows - BlockSize * (m + 1)) && i >= 0; i--)
{
for(int j = (deminfo.ncols -1) - (BlockSize) * m; j > (deminfo.ncols - BlockSize * (m + 1)) && j >= 0; j--)
{
Sum += imgdata[i][j], count++;
}
}
Block[len++] = Sum / double(count);
}
}

//计算所有分块均值的均值
for(int i = 0; i < SplRows * SplCols; i++)
{
Block_FC += Block[i];
}
Block_FC /= (SplRows * SplCols), Sum = 0;

//计算所有分块均值的方差
for(int i = 0; i < SplRows * SplCols; i++)
{
Sum += pow((Block[i] - Block_FC),2);
}

return Sum / (SplRows * SplCols);
}
double MainScramble(int **imgdata1, int **imgdata2)
{
double org, end, scram;
org = ScramblingDegree(imgdata1);
end = ScramblingDegree(imgdata2);
scram = 1 - end / org;
return scram;
}


四、效果评价

对1220X935连续置乱了三次,图像置乱度如下表:

置乱次数置乱度
10.3829
20.4617
30.6325
因此可以用次算法座位图象置乱度评价方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图像置乱