Matlab中对黑白图像的像素进行打乱

Scramble the pixels of black and white images in Matlab

我有一系列黑白图像(不是灰度,黑白;Matlab中的二维矩阵),我需要随机打乱像素。我在 Mathworks File Exchange (https://it.mathworks.com/matlabcentral/fileexchange/66472-image-shuffle) 中找到了这个包;其中一个函数 imScrambleRand 完全满足我的需要,但它适用于 RGB 图像(3D 矩阵)。有没有办法将黑白图像转换为 3D 矩阵,以便我可以使用该功能?或者任何人都可以建议任何其他脚本来满足我的需要吗?请记住,我不熟悉 Matlab,但我会尽力而为。

谢谢。

编辑 1: 当我导入 BW 图像时,我得到一个逻辑值的二维矩阵(0 = 黑色,1 = 白色)。我认为不同的数据格式(逻辑与整数)是使用 RGB 图像函数时产生错误的原因。

编辑 2: 我改编了上述包中的演示代码,并使用@Jonathan 的建议将 2D 矩阵转换为 3D 矩阵,并添加了一个循环将逻辑值转换为 RGB 整数值,然后使用 imScrambleRand 函数。它有效,但我得到的是下图:SCRAMBLED IMAGE. This is the BW picture I start with: BW IMAGE. So I checked the scrambled image, and the function from the FEX file actually scrambles within the RGB values, meaning that I found, for instance, a pixel with RGB 0,255,0。所以我解决了一个问题,但实际上函数内部存在一个问题:它不会扰乱像素,它会扰乱生成原始图片中不存在的颜色的值。

编辑 3: 我使用了@nhowe 提供的代码,我得到了我需要的代码,谢谢!

编辑 4: 好的,事实证明打乱像素是不行的,因为它会使图像太分散并且与起始图像不同(你不是说吗?) ,但我需要打乱 BLOCKS OF PIXELS 这样你就无法真正识别图像,但黑色像素不会太分散。有没有办法使用@nhowe 提供的代码来做到这一点?

编辑 5: 这个函数应该没问题: https://it.mathworks.com/matlabcentral/fileexchange/56160-hio-been-hb-imagescramble

从灰度到 RGB 的最简单解决方案可能是这样的:

rgbImage = cat(3, grayImage, grayImage, grayImage);

然后从 FEX 应用您的函数并提取一个颜色通道,假设 FEX 函数将产生三个相同的颜色通道。

打乱矩阵M的简单方法:

r = rand(size(M));
[~,ri] = sort(r(:));
M(ri) = M;