2015-06-01 4 views
-2

У меня есть изображение. Я хотел бы преобразовать это изображение в граф. Пиксели - это узлы, а ребра - 8-окрестности. я попыталсякак построить график связанных компонентов изображения?

I=imread('cameraman.tif'); 
[r c]=size(I); 
%r = 32; c = 32; 
%# Get the matrix size 
diagVec1 = repmat([ones(c-1,1); 0],r,1); %# Make the first diagonal vector 
%# (for horizontal connections) 
diagVec1 = diagVec1(1:end-1);    %# Remove the last value 
diagVec2 = [0; diagVec1(1:(c*(r-1)))]; %# Make the second diagonal vector 
%# (for anti-diagonal connections) 
diagVec3 = ones(c*(r-1),1);    %# Make the third diagonal vector 
%# (for vertical connections) 
diagVec4 = diagVec2(2:end-1);    %# Make the fourth diagonal vector 
rc = r*c; 
adj = spdiags([diagVec1;0],1,rc,rc); 
adj = adj + spdiags([diagVec2; zeros(c-1,1)], c-1, rc,rc); 
adj = adj + spdiags([diagVec3; zeros(c,1)], c, rc,rc); 
adj = adj + spdiags([diagVec4; zeros(c+1,1)], c+1, rc,rc); 
adj = adj + adj.'; 

%# plot adjacency matrix 
subplot(121), spy(adj) 

%# plot connected points on grid 
[X Y] = meshgrid(1:c,1:r); 
X = X(:); Y = Y(:); 
[xx yy] = gplot(adj, [X Y]); 
subplot(122), plot(xx, yy, 'ks-', 'MarkerFaceColor','r') 
axis([0 r+1 0 c+1]) 
%# add labels 
X = reshape(X',[],1) + 0.1; Y = reshape(Y',[],1) + 0.1; 
text(X, Y(end:-1:1), cellstr(num2str((1:r*c)'))) 

я попробовал этот code.But из проблемы памяти, отлично работает для 32 * 32 image.its не дублирует вопрос

+2

Это ** слишком широкий ** и, вероятно, основанный на мнениях. Вы в основном хотите представлять изображение в виде графика. Существует не менее трех способов представления графиков:> Adjacency List, Adjacency Matrix, Edge Lists. Каждое представление имеет свои преимущества и недостатки: https://www.khanacademy.org/computing/computer-science/algorithms/graph-representation/a/representing-graphs – rayryeng

+1

Посмотрите здесь: http://stackoverflow.com/questions/3277541/ construct-adjacency-matrix-in-matlab - поиск Google привел меня туда. Представлены как 4 связанных, так и 8 связанных окрестностей. Сделайте немного поиска и приложите немного усилий, прежде чем публиковать вопрос. Это на самом деле помогает уменьшить беспорядок. – rayryeng

+0

Прочитайте сообщение. То, что вы хотите, фактически не зависит от содержимого изображения. Подумайте об изображении как 2D прямоугольной сетке узлов, и вы хотите соединить ребра между узлами. Однако, если вы хотите, чтобы он зависел от содержимого изображения, может быть и другое: матрица смежности не будет 0s и 1s, но может представлять различия интенсивности. Я оставлю это для вас, чтобы понять это. – rayryeng

ответ

1

Вы можете использовать sparse_adj_matrix: функция полезности, которая вычисляет матрицу смежности для произвольных грид-графов (в частности, 2D 4-connect или 8-connect).
Скачать функцию от GitHub и типа

>> doc sparse_adj_matrix 

Чтобы увидеть, как его можно использовать.

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