2013-08-04 32 views
2

我需要在每行內創建一個n階Hadamard矩陣,將其加倍,隨機對矩陣的元素進行置換,然後顯示它。到目前爲止,我已經完成了所有這些事情。當我imshow(matrix)是一個很好的黑白盒子圖片時,我最終得到了什麼。 但我還沒有想出如何插入一條細線來劃分每一行。我可以創建類似左側的第一個圖像,而不是右邊(這是圖1和圖2從this paper)  enter image description here如何在灰度圖像中的每一行之間添加細水平線?

Any幫助或意見將徹底讚賞圖像

enter image description here

回答

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'); 

有: sizeOfAcube的QR碼一個立方體的大小。 numRows和numCols原始圖像的行數和列數。

+0

謝謝@R。 Bergamote。但是,你的代碼不起作用,但它給了我一些想法。我真的需要更多地瞭解matlab,並且在上下文中查看各種函數可以幫助實現這一點。 – StrugglingGradStudent

0

一種解決方案是,使用補丁程序,例如,如下所示:

% 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)接受多邊形元件的頂點作爲xy。在本例中,您可以修改術語[0.1 0.9 0.9 0.1]以設置邊界黑線的粗細。

這產生

enter image description here

編輯

對於通過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代替補丁來產生尖角。

圖像:

enter image description here

+0

謝謝你的迴應! @Try Hard,你的結果看起來很有希望,但是當我嘗試你的代碼時,我所得到的只是一個空白的數字。我已經操縱了一點點,我可以看到框的輪廓,但是,對matlab非常不熟悉,我不確定還有什麼需要修改。我當前生成矩陣的代碼如下: – StrugglingGradStudent

+0

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

+0

@StrugglingGradStudent請看看我的除了答案... –

2

我爲這類問題不必要地使用具有挑戰性的矢量的方法(例如,patchrectangle)找到。我認爲建立新形象更直接。這避免了浮點舍入問題和其他與矢量圖形一起出現的問題。下面我的解決方案依賴於圖像處理工具箱的一些功能,但簡單快捷:

% 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 image

sclpad參數可以很容易經過調整以獲得不同的尺寸和相對尺寸。如果需要,可以在添加行以進一步縮放圖像後再次調用imresize(...,'nearest')blocproc系列可能通過各種選項提高效率(請參閱幫助)。它也可以通過撥打電話im2colcol2im來取代,如果變得更糟,可能會更快。

+0

哇,你看起來這麼簡單!你甚至縮短了行倍增的過程。感謝您的迴應和洞察力,它非常有幫助! – StrugglingGradStudent

+0

@StrugglingGradStudent:你需要確保我正確地做了那部分。我真的不知道Hadamard矩陣需要什麼,我只是想創建一些數據來提供其餘代碼的演示。很高興這是有幫助的。讓我知道它是否最終解決您的問題。 – horchler

+1

@StrugglingGradStudent請考慮接受答案,如果它做了你想要的 –

相關問題