2013-08-04 2 views
2

Мне нужно создать матрицу Адамара n-го порядка, в строке с двумя строками внутри каждой строки произвольно переставить элементы матрицы, а затем отобразить ее. До сих пор я все это делал. В конце концов, когда я imshow(matrix) - это красивое изображение черно-белых коробок. Но я не понял, как вставить тонкую линию, чтобы разделить каждую строку. я могу создать что-то вроде первого изображения на левой стороне, но не изображение справа (это цифры 1 и 2 из this paper)Как можно добавить тонкие горизонтальные линии между каждой строкой в ​​полутоновом изображении?

enter image description here   enter image description here

Any помощь или замечания будут тщательно оценены ,

ответ

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 размер одного куба на QRcode. 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) принимает вершины элемента многоугольника как x и y. В этом примере вы можете изменить термин [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

Я нашел с помощью векторных подходов (например, 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 image

Параметры scl и pad могут быть легко с учетом различных размеров и относительных размеров. Вы можете позвонить imresize(...,'nearest') еще раз после добавления линий для дальнейшего масштабирования изображения, если это необходимо. Линия blocproc потенциально может быть более эффективной с различными параметрами (см. Справку). Его также можно было бы заменить вызовами im2col и col2im, которые, возможно, были бы более быстрыми, если бы грязнее.

+0

wow вы заставляете его выглядеть так просто! Вы даже сократили процесс удвоения строк. Спасибо за ваш ответ и прозрение, это очень помогает! – StrugglingGradStudent

+0

@ StrugglingGradStudent: вам нужно убедиться, что я правильно выполнил эту часть. Я действительно не знаю, что вам нужно с матрицей Адамара, я просто пытался создать некоторые данные, чтобы предоставить демонстрацию остальной части кода. Рад, что это было полезно. Дайте мне знать, если это решит вашу проблему. – horchler

+1

@ StrugglingGradStudent Пожалуйста, подумайте о том, чтобы принять ответ, если он сделал то, что вы хотели –

Смежные вопросы