【问题标题】:Image Shuffling with another image in MATLAB在 MATLAB 中与另一个图像进行图像混洗
【发布时间】:2013-02-01 15:11:35
【问题描述】:

这是我的一个线程中关于图像洗牌的问题的延续。

%# 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 的列和行是否都打乱了,还是只打乱了列?

【问题讨论】:

    标签: image matlab image-processing


    【解决方案1】:
    1. sort(X,dim) 沿维度dim 排序,即sort(X,1) 对每一列中的行进行排序,sort(X,2) 对每一行中的列进行排序。 sortrows(X,4)根据第四行对行进行排序,如果要对列进行排序,则必须先转置X。 sort(X(:) 对数组 X 的所有元素进行排序。
    2. 在这段代码中,img2 的所有元素都被打乱了。

    除了使用autumn.tif,您可能想尝试改组,例如magic(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
    

    【讨论】:

    • @Jonas。在你的回答中你说 sort(X,2) 对每一行中的列进行排序,那么为什么我们需要进行转置以便对所有列进行排序(参考你你的回复)。另外,sort(X(:)) 对所有元素进行排序,所以我想我们不必单独编写语句来对行和列进行排序?这个命令是矢量化的例子吗?再次感谢。
    • 我添加了一些示例。请看看原始数组如何变化。也许这会让你知道你想如何洗牌。
    • @Jonas。我真的很感谢乔纳斯让我理解我打算用你的例子做什么。我在 Matlab 中尝试了这些。有 2 个我无法理解的逻辑。1.如何行在 sort(m,2) 的每一列中排序。
    • 2.我想重新确认逻辑以检查我是否清楚地理解了 img1 的作用。在作为问题发布的代码中(实际上是您回答的),img1 的元素按行和列方式由命令排序sort(img1(:))。冒号具有双重目的,即同时获取行和列索引,而不是通过类似此命令 img2=(:,colScramble,:); 单独获取行和列索引; img2 = img2(rowScramble,:,:);那么,冒号就避免了这些步骤。是这样吗?那么排序后的像素位置就形成了对img2的元素进行洗牌的索引。
    • @Jonas,是否可以在不排序其他图像 img1 的情况下对图像进行洗牌?我们如何获得 scrambleIdx in[dummy,scrambleIdx]=sort(img1(:));没有排序/安排img1?
    猜你喜欢
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 2012-11-19
    相关资源
    最近更新 更多