1

それは基本的ですが、その方法がわかりません..画像で8x8ウィンドウを取り、そのウィンドウをさらに2x2に分割して、それらの平均値を見つける必要があります。これを行った後、この平均値マトリックスをしきい値平均 (画像全体の平均値またはその 8x8 ウィンドウの平均値) と比較する必要があります。要素がしきい値以上の場合、0 でない場合は 1 を割り当てます (バイナリ イメージに変換します)。すべての操作の後、256x256 の画像は 128x128 になります。圧縮が達成されます。この目的のために、以下のコードを書きました。

すべての操作を実行した後、各ループの後に (しきい値と比較した後に) 結果を格納する方法がわかりません。圧縮イメージを作成するには、これを行う必要があります。助けてください。私のコードの実行には時間がかかります。これはもっと簡単にコーディングできると思います。画像内でウィンドウをスライドさせる方法を説明し、処理された値を保存して出力画像を作成する方法を保存する方法を説明してください..明確な理解を得ることができます..ウィンドウをスライドさせたり、 MATLAB のその他のもの

私のコードはここにあります:

%In this code only the final window values are stored.. 以前のウィンドウの値は保存されません。圧縮された画像を取得するには、すべてのウィンドウの値を保存する必要があります。助けて。

I=imread('C:\Users\Prem\Documents\MATLAB\mandrill.jpg');
G=rgb2gray(I);
J=imresize(G,[256 256]);
thr=mean(J(:));
[m,n]=size(J); % Reading the size of the image
for i=1:m 
    for j=1:n

      P=J(i:(i+7),j:(j+7)); % Reading 8x8 window

        % Sub dividing the 8 x 8 window into four 4x4 sub windows 

    tl = P(1:4, 1:4); % top left sub-window
    tr = P(1:4, 5:8); % top right sub-window
    bl = P(5:8, 1:4); % bottom left sub-window
    br = P(5:8, 5:8); % bottom right sub-window

     % Sub dividing the 4 x 4 window into four 2x2 sub windows 

    newtl_1 = tl(1:2, 1:2); % top left sub-window
    newtr_1 = tl(1:2, 3:4); % top right sub-window
    newbl_1 = tl(3:4, 1:2); % bottom left sub-window
    newbr_1 = tl(3:4, 3:4); % bottom right sub-window

     % Sub dividing the 4 x 4 window into four 2x2 sub windows 

    newtl_2 = tr(1:2, 1:2); % top left sub-window
    newtr_2 = tr(1:2, 3:4); % top right sub-window
    newbl_2 = tr(3:4, 1:2); % bottom left sub-window
    newbr_2 = tr(3:4, 3:4); % bottom right sub-window

     % Sub dividing the 4 x 4 window into four 2x2 sub windows 

    newtl_3 = bl(1:2, 1:2); % top left sub-window
    newtr_3 = bl(1:2, 3:4); % top right sub-window
    newbl_3 = bl(3:4, 1:2); % bottom left sub-window
    newbr_3 = bl(3:4, 3:4); % bottom right sub-window

     % Sub dividing the 4 x 4 window into four 2x2 sub windows 

    newtl_4 = br(1:2, 1:2); % top left sub-window
    newtr_4 = br(1:2, 3:4); % top right sub-window
    newbl_4 = br(3:4, 1:2); % bottom left sub-window
    newbr_4 = br(3:4, 3:4); % bottom right sub-window

      % mean values of the four sub windows

        m1=mean(newtl_1(:));
        m2=mean(newtr_1(:));
        m3=mean(newbl_1(:));
        m4=mean(newbr_1(:));

         % mean values of the four sub windows

        m5=mean(newtl_2(:));
        m6=mean(newtr_2(:));
        m7=mean(newbl_2(:));
        m8=mean(newbr_2(:));

         % mean values of the four sub windows

        m9=mean(newtl_3(:));
        m10=mean(newtr_3(:));
        m11=mean(newbl_3(:));
        m12=mean(newbr_3(:));

        % mean values of the four sub windows

        m13=mean(newtl_4(:));
        m14=mean(newtr_4(:));
        m15=mean(newbl_4(:));
        m16=mean(newbr_4(:));

     M=[m1 m2 m3 m4; m5 m6 m7 m8; m9 m10 m11 m12; m13 m14 m15 m16];

OutputCompressedImage=M>thr;

    end
end
    imshow(OutputCompressedImage)

%In this code only the final window values are stored.. 以前のウィンドウの値は保存されません。圧縮された画像を取得するには、すべてのウィンドウの値を保存する必要があります。助けて。

4

1 に答える 1

0

ループの反復ごとに OutputCompressedImage を上書きしているため、最終的なウィンドウ値のみを取得します。これを行う 1 つの方法は、3 次元配列を使用してデータを保存することです。各スライスは 1 つのウィンドウを表します。

ループは次の方法で変更できます。

s=1;
for i=1:m 
    for j=1:n
      ****keep original code****
      OutputCompressedImage(:,:,s)=M>thr;
      s=s+1;
    end
end

OutputCompressedImage の次元には m*n スライスが必要です。

ウィンドウを横に移動するためのPSは、畳み込みの使用を検討できます。http://www.mathworks.com/help/matlab/ref/conv2.html

于 2013-10-02T17:36:45.723 に答える