Vấn đề là mã frdescp
(tôi đã sử dụng this code, phải giống như được bạn giới thiệu) cũng được viết để căn giữa các bộ mô tả Fourier.
Nếu bạn muốn mô tả hình dạng của mình một cách chính xác, bắt buộc phải bảo đảm một số bộ mô tả đối xứng đối với mô tả đại diện cho thành phần DC.
Những hình ảnh sau đây tóm tắt các khái niệm:
Để giải quyết vấn đề của bạn (và những người khác như của bạn), tôi đã viết hai chức năng sau:
function descriptors = fourierdescriptor(boundary)
%I assume that the boundary is a N x 2 matrix
%Also, N must be an even number
np = size(boundary, 1);
s = boundary(:, 1) + i*boundary(:, 2);
descriptors = fft(s);
descriptors = [descriptors((1+(np/2)):end); descriptors(1:np/2)];
end
function significativedescriptors = getsignificativedescriptors(alldescriptors, num)
%num is the number of significative descriptors (in your example, is was 20)
%In the following, I assume that num and size(alldescriptors,1) are even numbers
dim = size(alldescriptors, 1);
if num >= dim
significativedescriptors = alldescriptors;
else
a = (dim/2 - num/2) + 1;
b = dim/2 + num/2;
significativedescriptors = alldescriptors(a : b);
end
end
Know, bạn có thể sử dụng các chức năng trên như sau:
im = imread('test.jpg');
im = im2bw(im);
b = bwboundaries(im);
b = b{1};
%force the number of boundary points to be even
if mod(size(b,1), 2) ~= 0
b = [b; b(end, :)];
end
%define the number of significative descriptors I want to extract (it must be even)
numdescr = 20;
%Now, you can extract all fourier descriptors...
f = fourierdescriptor(b);
%...and get only the most significative:
f_sign = getsignificativedescriptors(f, numdescr);
Nguồn
2014-05-19 15:01:40
bạn lấy frdescp từ đâu? nó có thể là nguồn gốc của vấn đề – Rasman
Tôi nhận được nó từ xử lý hình ảnh kỹ thuật số của Gonzaelz bằng cách sử dụng cuốn sách MATLAB, thực sự tôi nghĩ rằng bwboundaries là vấn đề! –
Tôi đã chỉnh sửa [câu trả lời trước của tôi] (http://stackoverflow.com/a/23741097/738017), tôi hy vọng nó có thể hữu ích cho bạn và những người dùng khác. –