图像在MATLAB中使用另一个图像进行混洗

时间:2010-07-10 02:35:16

标签: image matlab image-processing

这是我的一个帖子中的Image Shuffling问题的继续。

%# 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的列和行是否都在此代码中进行了洗牌,或者只是列?

1 个答案:

答案 0 :(得分:1)

  1. sort(X,dim)按维度dim排序,即sort(X,1)对每列中的行进行排序,sort(X,2)对每行中的列进行排序。 sortrows(X,4)根据第四行对行进行排序,如果要对列进行排序,则必须先转置Xsort(X(:)对数组X的所有元素进行排序。
  2. 在此代码中,img2的所有元素都被洗牌。
  3. 您可能希望尝试改组,而不是使用autumn.tifmagic(5),一个5x5魔方,这样你就可以更好地了解发生了什么。

    修改

    以下是magic(5)

    的示例
    >> 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