परिवर्तन को समझने में मदद करें


19

मैं MATLAB में काम करने के लिए पर्याप्त परिवर्तन प्राप्त करने की कोशिश कर रहा हूं, लेकिन मुझे समस्या हो रही है। मेरे पास चोटियों का पता लगाने का एक बहुत बुरा तरीका है जिसे ठीक करने की आवश्यकता है, लेकिन इससे पहले कि मैं लाइनों को फिर से ठीक से बनाने के लिए पर्याप्त रूप से परिवर्तन करने में सक्षम होने की आवश्यकता है। यह इस प्रकार का सामान है जो मुझे अभी मिल रहा है:

यहाँ छवि विवरण दर्ज करें

ऐसा लगता है कि इसका आकार 90 डिग्री है, लेकिन मुझे यकीन नहीं है कि क्यों। मुझे यकीन नहीं है कि अगर यह मेरी गलत जगह है कि गलत है, या अगर यह जिस तरह से मैं डी-हाफ हूं और लाइनें खींचता हूं। क्या कोई मेरी चोटी का पता लगाने में मदद कर सकता है? कोड में उपयोग किए गए चित्र यहां हैं

%% load a sample image; convert to grayscale; convert to binary

%create 'x' image (works well)
a = eye(255);
b = flipud(eye(255));
x = a + b;
x(128,128) = 1;

%image = rgb2gray(imread('up.png')) < 255;
%image = rgb2gray(imread('hexagon.png')) < 255;
%image = rgb2gray(imread('traingle.png')) < 255;
%%% these work
%image = x;
%image = a;
image = b;    

%% set up variables for hough transform
theta_sample_frequency = 0.01;                                             
[x, y] = size(image);
rho_limit = norm([x y]);                                                
rho = (-rho_limit:1:rho_limit);
theta = (0:theta_sample_frequency:pi);
num_thetas = numel(theta);
num_rhos = numel(rho);
hough_space = zeros(num_rhos, num_thetas);

%% perform hough transform
for xi = 1:x
    for yj = 1:y
        if image(xi, yj) == 1 
            for theta_index = 1:num_thetas
                th = theta(theta_index);
                r  = xi * cos(th) + yj * sin(th);
                rho_index = round(r + num_rhos/2);                      
                hough_space(rho_index, theta_index) = ...
                     hough_space(rho_index, theta_index) + 1;
            end
        end
    end
end  

%% show hough transform
subplot(1,2,1);
imagesc(theta, rho, hough_space);
title('Hough Transform');
xlabel('Theta (radians)');
ylabel('Rho (pixels)');
colormap('gray');

%% detect peaks in hough transform
r = [];
c = [];
[max_in_col, row_number] = max(hough_space);
[rows, cols] = size(image);
difference = 25;
thresh = max(max(hough_space)) - difference;
for i = 1:size(max_in_col, 2)
   if max_in_col(i) > thresh
       c(end + 1) = i;
       r(end + 1) = row_number(i);
   end
end

%% plot all the detected peaks on hough transform image
hold on;
plot(theta(c), rho(r),'rx');
hold off;


%% plot the detected line superimposed on the original image
subplot(1,2,2)
imagesc(image);
colormap(gray);
hold on;

for i = 1:size(c,2)
    th = theta(c(i));
    rh = rho(r(i));
    m = -(cos(th)/sin(th));
    b = rh/sin(th);
    x = 1:cols;
    plot(x, m*x+b);
    hold on;
end

लिंक्ड: कैसे करें Hough की Hough ट्रांसफॉर्मड इमेज?


क्या आपने अपनी समस्या को हल करने का प्रबंधन किया? मैं एक ऐसे ही मुद्दे का सामना कर रहा हूं। धन्यवाद
इरेज़ पोस्नर

ट्रांसफ़ॉर्मिंग डे हफ़् स सूस मतलाब डेएक्टेक्टर प्लसियस इलिप्स

जवाबों:


11

सबसे पहले, माटलैब में बिल्ट इन हफ ट्रांसफॉर्म है : पहिए को सुदृढ़ करने की कोई आवश्यकता नहीं है।

[H,T,R] = hough(BW,'RhoResolution',0.5,'Theta',-90:0.5:89.5);

यद्यपि आपकी छवि को आवश्यक रूप से किनारे का पता लगाने की आवश्यकता नहीं है, आप एल्गोरिथ्म के प्रसंस्करण समय और प्रभावशीलता को बेहतर बना सकते हैं। आपके त्रिकोण में सफेद और काले रंग के वसा क्षेत्र हैं। आदर्श रूप से, त्रिकोण त्रिकोण के किनारों को चिह्नित करते हुए 1px मोटा होगा। कैनी एज डिटेक्शन का उपयोग करें

BW = edge(Image,'canny');

परिणाम \ _ थीटा रेंज डिग्री में है, जबकि आपका प्लॉट (या ) इसलिए डिग्री ( ) घटाएं ।0 < θ < 180 0 < θ < π 90 π / 290<θ<900<θ<1800<θ<π90π/2

आपके लिए गलत चोटी का चयन करने की क्षमता है क्योंकि पड़ोसी चोटियां हैं जो संचायक मैट्रिक्स में बड़ी हो सकती हैं। जबकि यहाँ कई एल्गोरिदम हैं जो मैंने पिछले दिनों Hough Transforms में उपयोग किए हैं।

1) Define a region shape (typically its square) 
2) Define an accumulator threshold  
3) Select one pixel in the accumulator matrix
4) If it is a peak (i.e., larger than neighboring values above a threshold)
       a) look at the points within the region shape.
       b) If there is a larger value
              this is not a peak
          Else
              this is a peak
 5) Move to next pixel in accumulator matrix.

हाइफ़ ट्रांसफ़ॉर्म लाइनों को प्रदर्शित करने के लिए HoughLines में देखें, परिणाम:

http://www.mathworks.com/help/toolbox/images/ref/houghlines.html

कैनी एज डिटेक्टर का उपयोग करने के प्रभाव

एज डिटेक्शन संभावित रूप से त्रिकोण के प्रत्येक पक्ष को दो लाइनों में बदल सकता है।

कैनी एज डिटेक्शन का लक्ष्य नॉनमैक्सिमल सुपरशन का उपयोग करके अधिकतम पतली / संकीर्ण किनारों का उत्पादन करना है

नटशेल में कैनी एज डिटेक्शन (स्रोत: डिजिटल इमेज प्रोसेसिंग, गोंजालेज)

1) Smooth input Image using a Gaussian Filter
2) Compute the Gradient magnitude and angle (Sobel, Perwitt or robert cross filters)
3) Apply Nonmaxima suppression (this is where the thinning happens) 
   a) Figure out which direction the edge is
   b) If the edge's magnitude is smaller than one of its two neighbors in the direction of the edge
          set the edge point to zero
      Else
          leave it alone
4) Use double thresholding and connectivity analysis to detect and link edges

उत्तर के लिए धन्यवाद। इसे बेहतर तरीके से समझने के लिए मैं इसे स्क्रैच से कर रहा हूं। कैनी एज डिटेक्शन अभी भी 2 त्रिकोण देता है। आंतरिक किनारे के लिए एक, और बाहरी किनारे के लिए बाहर। मैंने विकिपीडिया से सिद्धांत सीखा, जो बताता है कि थीटा 0: पीआई है। मुझे पता है कि फ़ंक्शन में निर्मित -pi / 2: pi / 2 का उपयोग करता है, लेकिन वास्तविक अंतर नहीं होना चाहिए?
१५:१२ पर ५११ पर आइसपिनर

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

क्या एज डिटेक्शन 2 लाइन्स नहीं पैदा करेगा जहाँ आप केवल 1 ढूंढना चाहते हैं? एक मोटी रेखा के केंद्र को खोजने वाला कुछ बेहतर होगा।
एंडोलिथ

@endolith में मूल पोस्ट में बढ़त का पता लगाने की थोड़ी चर्चा शामिल है
साइबरमेन

'पहिया को मजबूत करने की कोई जरूरत नहीं है'? मेरे प्रशिक्षक को ;-)
नाथन श्वरमन

3
    if image(xi, yj) == 1 

को बदलना होगा

    if image(yj, xi) == 1 

डीह में काम करने के लिए लाइनों के लिए


1

3 छोरों का उपयोग करके उत्तर कम है तो इष्टतम है और इसमें सुधार किया जा सकता है, यहाँ एक सहज दृष्टिकोण / दृष्टिकोण अधिक है:

मान्य बिंदुओं की प्रत्येक जोड़ी एक विशिष्ट a & b सेट करती है y = ax + b। एक पंक्ति में बहुत सारे जोड़े समान & b मान के साथ होंगे, इसलिए एक लंबी रेखा चोटी के रूप में मौजूद होगी। यह ध्रुवीय आर एंड टेटा निर्देशांक के लिए भी सही है।

प्रत्येक बिंदु को अलग से इलाज करने के बजाय, डॉट्स के जोड़े का उपयोग करें। यदि आप एक अलग सूची में सभी (आमतौर पर विरल) अंक को बेहतर तरीके से संग्रहीत कर सकते हैं, लेकिन यह एक जरूरी नहीं है।

  1. प्रत्येक जोड़ी को लें और इसकी a & b गणना करें। (मानों को अलग करने के लिए गोल)
  2. सरणी में विशिष्ट स्थान पर जाएं और 1 जोड़ें।

लंबी रेखा -> एक ही, बी के साथ बहुत सारे जोड़े।
छिटपुट अंक -> विशिष्ट कोशिकाओं में छोटी गिनती -> अव्यवस्था की तरह अधिक।


इसे देखने का एक अन्य तरीका रेडॉन / प्रोजेक्टिव दृष्टिकोण से है।

  • एक लाइन लम्बवत "कलेक्शन लाइन" के लिए दृढ़ता से प्रोजेक्ट करेगी ताकि उच्च स्कोर हो।
  • यदि लाइन और "एकत्रित लाइन" के बीच का कोण 90 डिग्री नहीं है या एकत्रित लाइन इस "एकत्रित लाइन" में अनुमानित सभी लाइन बिंदुओं को इकट्ठा नहीं करती है, तो कम स्कोर होगा।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.