Image MATLAB中图像与另一图像的混洗

Image MATLAB中图像与另一图像的混洗,image,matlab,image-processing,Image,Matlab,Image Processing,这是我的一个帖子中的问题图片的延续 %# scramble autumn.tif with itself img1 = imread('autumn.tif'); %# scramble [dummy,scrambleIdx] = sort(img1(:)); img2 = img1; img2(:) = img1(scrambleIdx); %# note the (:). If you don't use it, img2 becomes a vector %# unscr

这是我的一个帖子中的问题图片的延续

%# scramble autumn.tif with itself 

img1 = imread('autumn.tif'); 

%# scramble 
[dummy,scrambleIdx] = sort(img1(:)); 
img2 = img1; 
img2(:) = img1(scrambleIdx); %# note the (:). If you don't use it, img2 becomes a vector 

%# unscramble 
[dummy2,unscrambleIdx] = sort(scrambleIdx); 
img3 = img2; 
img3(:) = img2(unscrambleIdx); 
问题1:
sort(X,dim)
函数按升序排列X的列。这是否意味着X的所有维度

问题2:在这段代码中,img2的列和行都被洗牌了,还是只洗牌了列

  • sort(X,dim)
    沿维度排序
    dim
    ,即
    sort(X,1)
    对每列中的行进行排序,
    sort(X,2)
    对每行中的列进行排序
    sortrows(X,4)
    根据第四行对行进行排序,如果要对列进行排序,则必须先转置
    X
    sort(X(:)
    对数组的所有元素进行排序
    X
  • 在此代码中,
    img2
    的所有元素都被洗牌
  • 您可能不想使用
    秋.tif
    ,而想尝试在一个5x5的魔方上进行洗牌,例如
    magic(5)
    ,这样您可以更好地看到发生了什么

    编辑

    以下是
    magic(5)


    @Jonas.在你的回答中,你说过sort(X,2)对每行中的列进行排序,那么为什么我们需要进行转置来对所有列进行排序(参考你的回答)。另外,sort(X(:)对所有元素进行排序,这样我们就不必分别编写语句来对行和列进行排序了。这个命令是矢量化的一个示例吗?再次感谢。我添加了几个示例。请看一下原始数组是如何变化的。也许这会让您了解如何洗牌图像。@Jonas。我非常感谢您的帮助Jonas努力让我理解我打算用你的例子做什么。我在Matlab中尝试了这些。有两个逻辑我不理解。1.行在每列中如何排序(m,2)。2.我想重新确认逻辑,以检查我是否清楚地理解img1的作用。在作为问题发布的代码中(这实际上是由您回复的),img1的元素通过命令sort(img1(:)按行和列进行排序。冒号的双重用途是同时获取行和列索引,而不是通过类似以下命令的方式分别获取行和列索引,img2=(:,colScramble,:);img2=img2(rowsamble,:,:);因此,冒号避免了这些步骤。是这样吗?那么,排序后的像素位置构成了对img2元素进行无序排列的索引。@乔纳斯,可以在不对另一个图像img1进行排序的情况下对图像进行无序排列吗?如何在[dummy,scrambleIdx]=sort(img1(:);而不对img1进行排序/排列的情况下获得scrambleIdx?
    >> m = magic(5)
    m =
        17    24     1     8    15
        23     5     7    14    16
         4     6    13    20    22
        10    12    19    21     3
        11    18    25     2     9
    
    >> sort(m,1) %# sort rows in each column of m
    ans =
         4     5     1     2     3
        10     6     7     8     9
        11    12    13    14    15
        17    18    19    20    16
        23    24    25    21    22
    
    >> sort(m,2) %# sort columns in each row of m
    ans =
         1     8    15    17    24
         5     7    14    16    23
         4     6    13    20    22
         3    10    12    19    21
         2     9    11    18    25
    
    >> sortrows(m,3) %# sort the rows of m according to column 3
    ans =
        17    24     1     8    15
        23     5     7    14    16
         4     6    13    20    22
        10    12    19    21     3
        11    18    25     2     9
    
    >> mt = m' %'# transpose m
    mt =
        17    23     4    10    11
        24     5     6    12    18
         1     7    13    19    25
         8    14    20    21     2
        15    16    22     3     9
    
    >> sortrows(mt,2) %# sort the rows of the transpose of m according to col 2
    ans =
        24     5     6    12    18
         1     7    13    19    25
         8    14    20    21     2
        15    16    22     3     9
        17    23     4    10    11
    
    >> mm = m; %# assign an output array for the next operation
    >> mm(:) = sort(m(:)) %# sort all elements of m
    mm =
         1     6    11    16    21
         2     7    12    17    22
         3     8    13    18    23
         4     9    14    19    24
         5    10    15    20    25