मैं एज डिटेक्शन के लिए ह्यूफ ट्रांसफॉर्म का उपयोग करने की कोशिश कर रहा हूं, और आधार के रूप में ढाल छवियों का उपयोग करना चाहूंगा।
मैं अब तक क्या किया, छवि को देखते हुए I
आकार के [M,N]
और उसके आंशिक डेरिवेटिव gx
, gy
, के रूप में प्रत्येक पिक्सेल में ढाल कोण की गणना करने के लिए है thetas = atan(gy(x,y) ./ gx
। इसी तरह मैं ग्रेडिएंट परिमाण की गणना करता हूं magnitudes = sqrt(gx.^2+gy.^2)
।
Hough ट्रांसफ़ॉर्म बनाने के लिए, मैं निम्नलिखित MATLAB कोड का उपयोग करता हूं:
max_rho = ceil(sqrt(M^2 + N^2));
hough = zeros(2*max_rho, 101);
for x=1:M
for y=1:N
theta = thetas(x,y);
rho = x*cos(theta) + y*sin(theta);
rho_idx = round(rho)+max_rho;
theta_idx = floor((theta + pi/2) / pi * 100) + 1;
hough(rho_idx, theta_idx) = hough(rho_idx, theta_idx) + magnitudes(x,y);
end
end
परिणामी हूप रूपांतर देखने योग्य लगता है (देखें http://i.stack.imgur.com/hC9mP.png ), लेकिन जब मैं मूल छवि में किनारे के मापदंडों के रूप में इसकी मैक्सिमा का उपयोग करने का प्रयास करता हूं, तो परिणाम अधिक या कम यादृच्छिक लगते हैं। क्या मैंने पर्याप्त परिवर्तन के निर्माण में कुछ गलत किया है?
अद्यतन : मेरे पास अपने कोड में एक बेवकूफ गलती rho
थी : के x*cos(theta)+y*cos(theta)
बजाय के रूप में गणना की गई थी x*cos(theta)+y*sin(theta)
। यही है, मैं एक कोसाइन और एक साइन के बजाय दो कोसाइन का उपयोग कर रहा था। मैंने ऊपर कोड को संपादित किया है और नई परिणामी छवि नीचे है। इसने हालांकि ज्यादा बेहतर किनारों को नहीं दिया।
@endolith: बढ़त प्लॉट करने के लिए एक अधिक से अधिक मूल्य दिया, hough
पर मैट्रिक्स rho_idx, theta_idx
, मैं करने के लिए सूचकांक का अनुवाद rho,theta
मान:
theta = (theta_idx -1) / 100 * pi - pi / 2;
rho = rho_idx - max_rho;
अंत में मैं किनारे की साजिश के रूप में y= (rho - x*cos(theta)) / sin(theta)
।