2

n 次のアダマール行列を作成し、行を 2 倍にし、各行内で行列の要素をランダムに並べ替えてから表示する必要があります。これまでのところ、私はこれらすべてのことを達成しました。imshow(matrix)白黒の箱の素敵な写真になったときに私がたどり着くもの. しかし、各行を分割するために細い線を挿入する方法がわかりません。左側の最初の画像のようなものを作成できますが、右側の画像は作成できません (これらはこのペーパーの図 1 と 2 です) 。

ここに画像の説明を入力   ここに画像の説明を入力

ヘルプやコメントをいただければ幸いです。

4

3 に答える 3

2

この種の問題に対してベクトル アプローチ (たとえば、patchおよび) を使用することは、不必要に困難であることがわかりました。rectangle新しいイメージを構築する方が簡単だと思います。これにより、浮動小数点の丸めの問題や、ベクター グラフィックスで発生するその他の問題を回避できます。以下の私のソリューションは、Image Processing Toolbox のいくつかの関数に依存していますが、シンプルで高速です。

% Create data similarly to @TryHard
H = hadamard(48);
C = (1+[H;-H])/2;
rng(0); % Set seed
C(:) = C(randperm(numel(C))); % For demo, just permute all values, not rows

% Scale image and lines
scl = 10; % Amount to vertically scale each row
pad = 2;  % Number of pixels to add between each row
C = imresize(C,scl,'nearest');
C = blockproc(C,[scl size(C,2)],@(x)[x.data;zeros(pad,size(C,2))]);
C = C(1:end-pad,:); % Remove last line added

% Dispay image
imshow(C)

これにより、このようなイメージが得られます

           imshow 画像

sclパラメータとpadパラメータを簡単に調整して、さまざまなサイズと相対的なサイズを取得できます。imresize(...,'nearest')必要に応じて、線を追加した後にもう一度呼び出して、画像をさらに拡大縮小できます。このblocprocラインは、さまざまなオプションを使用してより効率的になる可能性があります (ヘルプを参照)。im2colまた、 andの呼び出しに置き換えることもcol2imできます。

于 2013-08-05T21:34:14.463 に答える
1

私はコードを試しませんでしたが、そのようなものがうまくいくはずだと思います:

sizeOfACube = 6;
numberOfRows = 47;    

RGB = imread('image.png');
RGB = imresize(A, [(numRows+numberOfRows) numCols]);


for i=1:1:NumberOfRows 
    RGB(i*6,:,:) = 0;
end

imagesc(RGB);
imwrite(RGB,'newImage.png');

with: sizeOfAcube QRcode 上の 1 つの立方体のサイズ。numRows と numCols は元の画像の行と列の数です。

于 2013-08-05T03:18:12.940 に答える
0

1 つの解決策は、たとえば次のようにパッチを使用することです。

% set up example array
xl = 24; yl = xl;
[X Y] = find(hadamard(xl)==1);
% generate figure
figure, hold on
for ii=1:length(X)
    patch(X(ii) + [0 0 1 1],Y(ii) + [0.1 0.9 0.9 0.1],[1 1 1],'Edgecolor',[1 1 1])
end
axis([0 xl+1 0 yl+1])
axis('square')

patch コマンドpatch(x,y, color)は、ポリゴン要素の頂点をxおよびとして受け入れますy。この例では、タームを変更し[0.1 0.9 0.9 0.1]て境界の黒い線の太さを設定できます。

これにより、

ここに画像の説明を入力

編集済み

OP によって提供される特定のインスタンスの場合:

H=Hadamard(48); %# now to row-double the matrix 
A=(1+H)/2;
B=(1-H)/2;
C=[A; B]; %# the code below randomly permutes elements within the rows of the matrix 
[nRows,nCols] = size(C); 
[junk,idx] = sort(rand(nRows,nCols),2); %# convert column indices into linear indices 
idx = (idx-1)*nRows + ndgrid(1:nRows,1:nCols); %# rearrange whatever matrix 
E = C; 
E(:) = E(idx);
[X Y] = find(logical(E));
xl = length(X);
yl = length(Y);
figure, hold on
for ii=1:xl
     rectangle('Position',[X(ii) Y(ii)+.2 1 0.8],'facecolor',[1 1 1],'edgecolor',[1 1 1])
end
axis([0 max(X)+1 0 max(Y)+1])
axis('square')
set(gca,'color',[0 0 0])
set(gca,'XTickLabel',[],'YTickLabel',[],'XTick',[],'YTick',[])

この例ではrectangle、 patch の代わりに使用して鋭い角を生成します。

画像:

ここに画像の説明を入力

于 2013-08-05T09:54:37.847 に答える