2009-12-21 40 views
9

Tôi muốn vẽ một đường thẳng từ một điểm được xác định tới điểm khác và sau đó biến nó thành ma trận hình ảnh để sử dụng bộ lọc Gaussian trên nó để làm mịn. Đối với điều này tôi sử dụng các chức năng linegetframe để vẽ một đường thẳng và chụp cửa sổ hình trong một hình ảnh, nhưng getframe là rất chậm và không đáng tin cậy lắm. Tôi nhận thấy rằng nó không nắm bắt bất cứ điều gì khi máy tính bị khóa và tôi nhận được một lỗi out of memory sau 170 lần thực thi.Làm cách nào để tạo ma trận hình ảnh với một đường kẻ được vẽ trong MATLAB?

Câu hỏi của tôi là:

  • Có một thay thế để getframe mà tôi có thể sử dụng không?
  • Có cách nào để tạo ma trận hình ảnh và vẽ đường trực tiếp trong đó không?

Đây là một mẫu mã tối thiểu:

figure1=line([30 35] ,[200 60]); 
F= getframe; 
hsize=40; sigma=20; 
h = fspecial('gaussian',hsize,sigma); 
filteredImg = imfilter(double(F.cdata), h,256); 
imshow(uint8(filteredImg)); 

[cập nhật]

hiệu suất cao ý tưởng của Mark với linspace trông rất hứa hẹn, nhưng làm thế nào để truy cập vào ma trận tọa độ tính toán với linspace? Tôi đã thử đoạn mã sau, nhưng nó không hoạt động như tôi nghĩ. Tôi cho rằng đó là một điều MATLAB rất đơn giản và cơ bản, nhưng tôi chỉ không thể quấn quanh đầu tôi nó:

matrix=zeros(200,60); 
diagonal=round([linspace(30,200,numSteps); linspace(35,60,numSteps)]); 
matrix(diagonal(1,:), diagonal(2,:))=1; 
imshow(matrix); 
+0

Vì vậy, những gì bạn đang làm là rasterisation của một hình ảnh vector. Rất nhiều tài liệu tham khảo tốt về chủ đề này, Wikipedia, như mọi khi, là một nơi tốt để bắt đầu. –

+0

Tôi biết, nhưng tôi luôn cố gắng sử dụng các chức năng riêng của Matlab. Tôi không học nhiều, nhưng chúng nhanh hơn và tôi không phải tốn thời gian để gỡ lỗi chúng như mã của riêng tôi. – Framester

Trả lời

15

Dưới đây là một ví dụ về việc vẽ đường trực tiếp vào ma trận. Đầu tiên, chúng tôi sẽ tạo ra một ma trận các zeros cho một hình ảnh trống:

mat = zeros(250, 250, 'uint8'); % A 250-by-250 matrix of type uint8 

Sau đó, giả sử chúng ta muốn vẽ một đường chạy từ (30, 35) để (200, 60). Đầu tiên chúng ta sẽ tính toán có bao nhiêu pixel dài dòng sẽ phải là:

x = [30 200]; % x coordinates (running along matrix columns) 
y = [35 60]; % y coordinates (running along matrix rows) 
nPoints = max(abs(diff(x)), abs(diff(y)))+1; % Number of points in line 

Tiếp theo, chúng tôi tính toán hàng và cột chỉ số cho các điểm ảnh dòng sử dụng linspace, chuyển đổi chúng từ chỉ số subscripted để chỉ số tuyến tính sử dụng sub2ind, sau đó sử dụng chúng để sửa đổi mat:

rIndex = round(linspace(y(1), y(2), nPoints)); % Row indices 
cIndex = round(linspace(x(1), x(2), nPoints)); % Column indices 
index = sub2ind(size(mat), rIndex, cIndex);  % Linear indices 
mat(index) = 255; % Set the line pixels to the max value of 255 for uint8 types 

sau đó bạn có thể hình dung dòng và phiên bản lọc như sau:

subplot(1, 2, 1); 
image(mat);  % Show original line image 
colormap(gray); % Change colormap 
title('Line'); 

subplot(1, 2, 2); 
h = fspecial('gaussian', 20, 10); % Create filter 
filteredImg = imfilter(mat, h); % Filter image 
image(filteredImg);    % Show filtered line image 
title('Filtered line'); 

enter image description here

+0

Cảm ơn gnovice cho câu trả lời toàn diện của bạn! – Framester

0

Something như thế này:

[linspace (30.200, numSteps); linspace (35,60, numSteps)]

Điều đó có phù hợp với bạn không?

Đánh dấu

+0

Linspace trông rất hứa hẹn, nhưng làm thế nào để tôi truy cập vào các tọa độ của ma trận được tính bằng không gian? Tôi đã thử 30 phút cuối cùng, nhưng đoạn mã sau không hoạt động, như tôi nghĩ nó nên .. (scnr) Tôi giả định, nó là một điều Matlab rất đơn giản và cơ bản, nhưng tôi không thể quấn đầu quanh nó được. ma trận = số không (200,60); diagonal = round ([khoảng trống (30,200, numSteps); khoảng trắng (35,60, numSteps)]); ma trận (đường chéo (1, :), đường chéo (2,:)) = 1; imshow (ma trận); – Framester

0

Bạn có thể kiểm tra câu trả lời của mình here. Đó là cách mạnh mẽ để đạt được những gì bạn đang yêu cầu. Lợi thế của cách tiếp cận của tôi là nó không cần tham số bổ sung để kiểm soát mật độ của đường vẽ.

3

Nếu bạn có hộp công cụ Hệ thống tầm nhìn máy tính, có sẵn đối tượng ShapeInserter. Điều này có thể được sử dụng để vẽ các đường thẳng, hình tròn, hình chữ nhật và đa giác trên hình ảnh.

mat = zeros(250,250,'uint8'); 
shapeInserter = vision.ShapeInserter('Shape', 'Lines', 'BorderColor', 'White'); 
y = step(shapeInserter, mat, int32([30 60 180 210])); 
imshow(y); 

http://www.mathworks.com/help/vision/ref/vision.shapeinserterclass.html

Các vấn đề liên quan