我需要在每行內創建一個n階Hadamard矩陣,將其加倍,隨機對矩陣的元素進行置換,然後顯示它。到目前爲止,我已經完成了所有這些事情。當我imshow(matrix)
是一個很好的黑白盒子圖片時,我最終得到了什麼。 但我還沒有想出如何插入一條細線來劃分每一行。我可以創建類似左側的第一個圖像,而不是右邊(這是圖1和圖2從this paper) 如何在灰度圖像中的每一行之間添加細水平線?
Any幫助或意見將徹底讚賞圖像
。
我需要在每行內創建一個n階Hadamard矩陣,將其加倍,隨機對矩陣的元素進行置換,然後顯示它。到目前爲止,我已經完成了所有這些事情。當我imshow(matrix)
是一個很好的黑白盒子圖片時,我最終得到了什麼。 但我還沒有想出如何插入一條細線來劃分每一行。我可以創建類似左側的第一個圖像,而不是右邊(這是圖1和圖2從this paper) 如何在灰度圖像中的每一行之間添加細水平線?
Any幫助或意見將徹底讚賞圖像
。
我沒有嘗試的代碼,但我認爲,這樣的事情應該工作:
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');
有: sizeOfAcube的QR碼一個立方體的大小。 numRows和numCols原始圖像的行數和列數。
一種解決方案是,使用補丁程序,例如,如下所示:
% 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(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
代替補丁來產生尖角。
圖像:
謝謝你的迴應! @Try Hard,你的結果看起來很有希望,但是當我嘗試你的代碼時,我所得到的只是一個空白的數字。我已經操縱了一點點,我可以看到框的輪廓,但是,對matlab非常不熟悉,我不確定還有什麼需要修改。我當前生成矩陣的代碼如下: – StrugglingGradStudent
H = Hadamard(48) %#現在行到行的兩倍 A =(1 + H)/ 2 B =(1 -H)/ 2 C = [A; B] %#下面的代碼隨機置換矩陣行內的元素[nRows,nCols] = size(C); [〜,idx] = sort(rand(nRows,nCols),2); %#將列索引轉換爲線索引 idx =(idx-1)* nRows + ndgrid(1:nRows,1:nCols); %#重新排列任何矩陣 E = C; E(:) = E(IDX) imshow(E) – StrugglingGradStudent
@StrugglingGradStudent請看看我的除了答案... –
我爲這類問題不必要地使用具有挑戰性的矢量的方法(例如,patch
和rectangle
)找到。我認爲建立新形象更直接。這避免了浮點舍入問題和其他與矢量圖形一起出現的問題。下面我的解決方案依賴於圖像處理工具箱的一些功能,但簡單快捷:
% 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
和col2im
來取代,如果變得更糟,可能會更快。
哇,你看起來這麼簡單!你甚至縮短了行倍增的過程。感謝您的迴應和洞察力,它非常有幫助! – StrugglingGradStudent
@StrugglingGradStudent:你需要確保我正確地做了那部分。我真的不知道Hadamard矩陣需要什麼,我只是想創建一些數據來提供其餘代碼的演示。很高興這是有幫助的。讓我知道它是否最終解決您的問題。 – horchler
@StrugglingGradStudent請考慮接受答案,如果它做了你想要的 –
謝謝@R。 Bergamote。但是,你的代碼不起作用,但它給了我一些想法。我真的需要更多地瞭解matlab,並且在上下文中查看各種函數可以幫助實現這一點。 – StrugglingGradStudent