2012-02-06 13 views
5

मैं कुछ व्यवहार मनोविज्ञान अनुसंधान के लिए स्कोरिंग सिस्टम के साथ आने की कोशिश कर रहा हूं।अनियमित आकार तुलना

मैं एक पत्र आकर्षित करने के लिए लोगों से पूछते हैं, तो एक ग्राफिक्स टेबलेट पर, इस पर पता लगाने के दोनों। मैं इस निशान की सटीकता का आकलन करना चाहता हूं। तो, आप कोई भी अक्षर ('ए') खींचते हैं, फिर आप इसे फिर से करते हैं, फिर मैं इसे इस पर आधारित करता हूं कि पहली बार आपने इसे कैसे खींचा था। चित्र पिक्सेल स्थानों के रूप में संग्रहीत हैं।

शुद्धता को मूल पत्र के निकटता के रूप में मूल्यांकन किया जाता है। विधि को स्केल, रोटेशन या स्थिति बदलने के लिए अनुमति देने की आवश्यकता नहीं है। संकल्पनात्मक रूप से यह दो पंक्तियों के बीच के क्षेत्र की तरह है, केवल लाइनें अनियमित हैं, इसलिए एकीकृत (मेरे ज्ञान के लिए) काम नहीं करेंगे।

मैं MATLAB में लिख रहा हूं, लेकिन किसी भी वैचारिक सहायता की सराहना की जाएगी। मैंने खींचे गए सभी पिक्सेल के बीच न्यूनतम दूरी को मापने का प्रयास किया है, लेकिन यह अच्छी तरह से सिंगल पॉइंट्स के लिए अच्छे (कम) स्कोर देता है।

इस से पहले किया जाना चाहिए है, लेकिन मुझे अपनी खोजों के साथ किसी भी नसीब होने नहीं कर रहा हूँ। किसी भी मदद की बहुत सराहना की!

--- नीचे दिए गए विधि द्वारा सुझाए गए विधि का उपयोग करके आंशिक समाधान। काम नहीं करता है, क्योंकि bwdist ढाल बहुत खड़ा है। अच्छी दूसरी छवि बिल शो के बजाए, यह मूल की तरह दिखता है।

%% Letter to image 
im = zeros(1080,1920,3); % The screen (possible pixel locations) 
% A small square a bit like the letter 'a', a couple of pixels wide. 
pixthick = 5; 
im(450:450+pixthick,[900:1100],:) = 1; 
im(550:550+pixthick,[900:1100],:) = 1; 
im([450:550],900:900+pixthick,:) = 1; 
im([450:570],1100:1100+pixthick,:) = 1; 
subplot(2,1,1); imagesc(im); %% atransbw = bwdist(im(:,:,1)<0.5); subplot(2,1,2); 
imagesc(atransbw); 
+0

आपके द्वारा पहले से वर्णित विधि के साथ समस्या क्या है? (सबसे छोटी दूरी का योग) – Ali

+0

एक एकल बिंदु बहुत अधिक स्कोर कर सकता है, क्योंकि कम दूरी खोजने के लिए केवल एक ही मूल्य है। जैसे एक सर्कल के केंद्र में एक बिंदु की कल्पना करें - सबसे छोटी दूरी का योग छोटा होगा, जिसका अर्थ है एक अच्छा स्कोर, जब यह वास्तव में काफी खराब निशान होता है। – dgmp88

उत्तर

2

क्या आप मदद कर सकता है एक distance transformbwdist के रूप में MATLAB में लागू किया है। यह पुरस्कार रेखाएं बंद हो रही हैं, भले ही वे मेल न करें।

a_img_1 = imread('a.jpg'); 
imagesc(a_img_1); 

enter image description here

a_img_1_dist_transform = bwdist(a(:, :, 1) < 250); 
imagesc(a_img_1_dist_transform); 

enter image description here

आप दूसरी छवि के साथ भी ऐसा कर सकते हैं, और दूरी तब्दील छवियों में पिक्सेल मूल्यों में अंतर योग, कुछ की तरह:

score = sum(abs(a_img_1_dist_transform(:) - a_img_2_dist_transform(:))) 

(ध्यान दें कि इससे उच्च स्कोर मिलेगा कम समान छवियों और v.v.)

"अच्छे (कम) स्कोर अच्छी तरह से एकल बिंदुओं के लिए" जिन मुद्दों का आप उल्लेख करते हैं उन्हें रोकने में मदद के लिए, आप पिक्सेल मानों के बीच स्क्वायर दूरी जैसे अन्य दूरी उपायों के साथ प्रयोग कर सकते हैं।

+0

ठीक है, मैं कोशिश करूँगा और इसे कार्यान्वित करूंगा - धन्यवाद! इस समाधान के साथ मेरी एकमात्र समस्या यह है कि यह काफी महंगा है कि 'छवियों' केवल वैक्टर के रूप में संग्रहीत हैं। क्षमा करें, मुझे लगता है कि मैं इतना स्पष्ट नहीं था - छवि-तुलना सबसे अच्छा टैग नहीं हो सकता है। फिर भी, यह काम कर सकता है, मैं एक बैठक के बाद एक पल में कोशिश करूंगा। चीयर्स! (वोट करने की कोशिश की लेकिन मेरा प्रतिनिधि अभी तक उच्च नहीं है) – dgmp88

+0

क्या आपका मतलब है कि वे रास्टर फ़ाइलों की बजाय वेक्टर छवियों के रूप में संग्रहीत हैं? उस स्थिति में, हाँ, मुझे यकीन है कि इस उत्तर से बेहतर तरीके होंगे। –

+0

छवियों को भी नहीं - यह केवल पिक्सेल स्थानों का एक दो आयामी वेक्टर है जहां पेन ने ग्राफिक्स टैबलेट को छुआ। – dgmp88

1

आप एक affine को बदलने कि कुछ त्रुटि कसौटी से मेल खाना होगा खोजने के लिए चाहते हो सकता है, का कहना है कि इसका मतलब वर्ग त्रुटि। इस तरह आप अनुवाद और स्केलिंग के लिए invariant होगा। या यदि आप अनुवाद को दंडित करना चाहते हैं, तो आप अनुवाद की लागत भी जोड़ सकते हैं। (यह हमें आपकी मदद करता है, तो आप सुविधाओं की किस तरह समान है या नहीं तो मानते हैं पर अधिक जानकारी देने में मदद मिलेगी)

अब, एक कुशल कार्यान्वयन अलग बात है। शायद आपको छवि पंजीकरण में देखना चाहिए। मुझे यकीन है कि यह कई बार किया गया है।

+0

अनुवाद और स्केलिंग के लिए Invariance महत्वपूर्ण नहीं है। संकल्पनात्मक रूप से, मूल और ट्रेस के बीच के क्षेत्र की गणना करने का कोई तरीका सही होगा। यदि आप पेंट में बाल्टी भरने के उपकरण का उपयोग करते हैं तो कुछ ऐसा लगता है, जहां प्रत्येक स्थान और मूल एक दूसरे से विचलित हो जाता है, तो वह सही होगा। मैं एफ़िन ट्रांसफॉर्म और छवि पंजीकरण, चीयर्स में देखूंगा! – dgmp88

0

मैं वास्तव में एक बहुत अधिक उच्च स्तरीय समाधान का सुझाव दूंगा। एक ओसीआर मशीन लर्निंग एल्गोरिदम खोजें जो किसी प्रकार का आत्मविश्वास देता है। या, यदि आपके पास विश्वास नहीं है, तो आउटपुट टेक्स्ट और वास्तविक के बीच की दूरी का परीक्षण करें।
यह एक ऐसे इंसान की तरह है जो हस्तलेखन को समझता है और इसे समझने का प्रयास करता है। जितना अधिक आत्मविश्वास उतना ही बेहतर होगा।

+0

ओसीआर समाधान वास्तव में उच्च स्तर लगता है। मुझे यकीन है कि यह काम करेगा, लेकिन मैं एक आसान समाधान की उम्मीद कर रहा हूं, क्योंकि मैं अक्षरों को परिभाषित करने के लिए बस पिक्सेल स्थानों के संग्रह का उपयोग कर रहा हूं। लेकिन हाँ, मुझे अंत में यह करना पड़ सकता है :)। – dgmp88

3

आकार संदर्भ आकार के "ध्रुवीय हिस्टोग्राम" के आधार पर एक शक्तिशाली विशेषता वर्णनकर्ता हैं। Wikipedia page गहराई से है, लेकिन here अतिरिक्त जानकारी वाला एक और पृष्ठ है (और तकनीक का एक अच्छा दृश्य स्पष्टीकरण), साथ ही साथ MATLAB demo code। मिलान पत्र विधि के मूल अनुप्रयोगों में से एक था, और जिस डेमो कोड से मैं लिंक करता हूं उसे आपको अपने ट्रेस वैक्टर को छवियों में बदलने की आवश्यकता नहीं होती है।

एक और सरल विधि एक "छवि अंतर" हो सकती है जो विशिष्ट या दो अक्षरों के रूप में परिभाषित की जाती है। इसके लिए बार्सरी छवियों में अपने ट्रेस वैक्टर को परिवर्तित करने की आवश्यकता होगी। की तरह कुछ:

x = xor(im1,im2); 
d = sum(x(:))/sum(im1(:)); %# normalize to the first image 

अंत में, अपने निशान वैक्टर अंक की एक ही नंबर है, या नमूना द्वारा करने के लिए किया जा सकता है, Procrustes विश्लेषण उपयोगी हो सकता है। Procrustes विश्लेषण का विचार बिंदुओं के दो सेटों के बीच कम-वर्ग इष्टतम रैखिक परिवर्तन (रोटेशन, अनुवाद और स्केलिंग) ढूंढना है। दो बिंदु सेटों के बीच फिट की भलाई "प्रोकस्ट्स आंकड़े" या अंक के रूट-माध्य-स्क्वायर विचलन जैसे अन्य उपायों द्वारा दी जाती है।

%# Whatever makes sense; 
%# procrustes needs N x 2 matrices with (x,y) coords for N points. 
coords1 = [x1 y1]; 
coords2 = [x2 y2]; 

%# This sampling may be too naive. 
n = max(size(coords1,1), size(coords2,1)); 
coords1 = coords1(1:n,:); 
coords2 = coords2(1:n,:); 

%# d is sum-of-squares error 
%# z is transformed coords2 
%# tr is the linear transformation 
[ d, z, tr ] = procrustes(coords1, coords2); 

%# RMS deviation of points may be better than SSE. 
n = size(coords1,1); 
rmsd = sqrt((sum((coords1(:) - z(:)).^2)/n)); 
+0

अच्छा विचार, धन्यवाद! हालांकि एक समस्या यह है कि मैं नहीं चाहता कि विभिन्न परिवर्तनों के लिए आविष्कार जो संदर्भों को प्रसंस्करण और आकार देता है - बहुत छोटी/बड़ी/घुमावदार गिनती त्रुटियों के रूप में अनुमति देता है। – dgmp88

+0

स्केलिंग घटक को बंद करने के लिए आप 'procrustes (X, Y, 'स्केलिंग', झूठी) का उपयोग कर सकते हैं। आप सीधे अंक के आरएमएसडी या एसएसई का भी उपयोग कर सकते हैं ... –

+0

धन्यवाद, मैं इसका परीक्षण करूंगा और बिल चेथम द्वारा प्रस्तावित समाधान के एक अलग संस्करण के साथ इसकी तुलना करूंगा, मैं अभी काम कर रहा हूं। – dgmp88

1

यह मेरा अंतिम, overcomplicated समाधान, जो मूल रूप से बिल Cheatham की विधि का उपयोग करता है। पूरी सहायताके लिए शुक्रिया!

% pixLet is the 2D vector contain locations where drawing occurred. First convert it to an image. 

im = zeros(1000,1000); % This is the image 
for pix = 2:size(pixLet,1) 
    y1 = pixLet(pix-1,2); x1 = pixLet(pix-1,1); 
    y2 = pixLet(pix,2); x2 = pixLet(pix,1); 
    xyd = round(pdist([x1 y1; x2 y2])*2); 
    xs = round(linspace(x1,x2,xyd)); 
    ys = round(linspace(y1,y2,xyd)); 
    for linepix = 1:length(xs) 
     im(ys(linepix),xs(linepix)) = 1; 
    end 
end 

% Blur the image 
blur = fspecial('gaussian',[sz sz],reach); 
gausIm = conv2(im,blur,'same'); 

% I made a function of the above to do this for both the template and the trace. 
score = sum(sum(abs(gausIm1-gausIm2))); 
संबंधित मुद्दे