n 次のアダマール行列を作成し、行を 2 倍にし、各行内で行列の要素をランダムに並べ替えてから表示する必要があります。これまでのところ、私はこれらすべてのことを達成しました。imshow(matrix)
白黒の箱の素敵な写真になったときに私がたどり着くもの. しかし、各行を分割するために細い線を挿入する方法がわかりません。左側の最初の画像のようなものを作成できますが、右側の画像は作成できません (これらはこのペーパーの図 1 と 2 です) 。
ヘルプやコメントをいただければ幸いです。
n 次のアダマール行列を作成し、行を 2 倍にし、各行内で行列の要素をランダムに並べ替えてから表示する必要があります。これまでのところ、私はこれらすべてのことを達成しました。imshow(matrix)
白黒の箱の素敵な写真になったときに私がたどり着くもの. しかし、各行を分割するために細い線を挿入する方法がわかりません。左側の最初の画像のようなものを作成できますが、右側の画像は作成できません (これらはこのペーパーの図 1 と 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)
これにより、このようなイメージが得られます
scl
パラメータとpad
パラメータを簡単に調整して、さまざまなサイズと相対的なサイズを取得できます。imresize(...,'nearest')
必要に応じて、線を追加した後にもう一度呼び出して、画像をさらに拡大縮小できます。このblocproc
ラインは、さまざまなオプションを使用してより効率的になる可能性があります (ヘルプを参照)。im2col
また、 andの呼び出しに置き換えることもcol2im
できます。
私はコードを試しませんでしたが、そのようなものがうまくいくはずだと思います:
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 は元の画像の行と列の数です。
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 の代わりに使用して鋭い角を生成します。
画像: