Hough রূপান্তর বুঝতে সহায়তা করুন


19

আমি ম্যাটল্যাবে কাজ করার জন্য একটি হাফ রূপান্তরিত করার চেষ্টা করছি তবে আমার সমস্যা হচ্ছে having আমার কাছে শিখরগুলি শনাক্ত করার খুব খারাপ উপায় আছে যা ঠিক করা দরকার তবে এর আগে আমাকে আবার লাইনগুলি সঠিকভাবে তৈরি করতে হফ ট্রান্সফর্মটিকে বিপরীত করতে সক্ষম হতে হবে। আমি এখনই এই ধরণের জিনিস পাচ্ছি:

এখানে চিত্র বর্ণনা লিখুন

এটি 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

লিঙ্কযুক্ত: কীভাবে হাফ রূপান্তরিত ইমেজের ডি-হাউজিং করবেন?


আপনি কি আপনার সমস্যার সমাধান করতে পারেন? আমি একই রকম সমস্যার মুখোমুখি হচ্ছি। ধন্যবাদ
এরেজ পোজনার

রূপান্তর ডি গোছ sous মতলব plusieurs উপবৃত্ত détecter ঢালা

উত্তর:


11

প্রথমত, মতলব একটি বিল্ট ইন হফ ট্রান্সফর্ম রয়েছে : চাকাটি পুনর্বিবেচনার দরকার নেই।

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

যদিও আপনার চিত্রটির প্রান্ত সনাক্তকরণের প্রয়োজনীয়তা নেই তবে আপনি এটি ব্যবহার করে অ্যালগোরিদমের প্রক্রিয়াকরণের সময় এবং কার্যকারিতা উন্নত করতে পারেন। আপনার ত্রিভুজটিতে সাদা এবং কালো রঙের ফ্যাট অঞ্চল রয়েছে। আদর্শভাবে, ত্রিভুজটি ত্রিভুজের প্রান্তগুলি চিহ্নিত করে 1px পুরু হবে। ক্যানি এজ সনাক্তকরণ ব্যবহার করুন

BW = edge(Image,'canny');

ফলাফলটি হ'ল \ থাটা ডিগ্রি সীমার মধ্যে রয়েছে যখন আপনার প্লট (বা ) তাই ডিগ্রি ( ) বিয়োগ করুন ।-90<θ<900<θ<1800<θ<π90π/2

আপনার পক্ষে ভুল শিখর বেছে নেওয়ার সম্ভাবনা রয়েছে কারণ এখানে প্রতিবেশী শিখর রয়েছে যা সংগ্রহকারী ম্যাট্রিক্সে আরও বড় হতে পারে। যদিও এখানে অনেক অ্যালগরিদম রয়েছে যা আমি অতীতে হাফ ট্রান্সফর্মগুলিতে ব্যবহার করে দেখেছি:

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.

হাফ ট্রান্সফর্ম লাইনগুলি প্রদর্শনের জন্য হফলাইনগুলি দেখুন: ফলাফল:

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 ব্যবহার করে, তবে এর মধ্যে একটি আসল পার্থক্য থাকা উচিত নয়?
waspinator

ব্যাট থেকে সরাসরি, ব্যাপ্তিটি একটি পার্থক্য করা উচিত। (আপনি কি 180 ডিগ্রি ঘোরানো একটি লাইনের মধ্যে পার্থক্যটি বলতে পারবেন?) তবে আপনি যদি চিত্র সংশোধন অ্যালগরিদমগুলির জন্য পোঁদ ট্রান্সফর্ম ব্যবহার করে থাকেন তবে এটি কোনও পার্থক্য করতে পারে। (এর অর্থ হবে রাইটসাইড এবং আপসাইডাউনড ইমেজের মধ্যে পার্থক্য)
সাইবারমেন

প্রান্ত সনাক্তকরণ 2 টি লাইন তৈরি করবে না যেখানে আপনি কেবল 1 টি পেতে চান? একটি মোটা লাইনের কেন্দ্র খুঁজে পাওয়া কিছু ভাল।
এন্ডোলিথ

@ এন্ডোলিথ মূল পোস্টে প্রান্ত সনাক্তকরণের জন্য কিছুটা আলোচনা অন্তর্ভুক্ত করেছে
সাইবারম্যান

'চাকা পুনর্নবীকরণের দরকার নেই'? আমার প্রশিক্ষকের কাছে এটি বলুন ;-)
নাথান শোয়ারম্যান

3
    if image(xi, yj) == 1 

পরিবর্তন করা প্রয়োজন

    if image(yj, xi) == 1 

লাইনগুলি ডিহুতে কাজ করার জন্য


1

3 টি লুপ ব্যবহার করে উত্তরটি তখন অনুকূল এবং কম উন্নত হতে পারে, এখানে একটি স্বজ্ঞাত দৃষ্টিভঙ্গি / দৃষ্টিকোণ আরও দেওয়া হয়েছে:

বৈধ পয়েন্টগুলির প্রতিটি জুড়ি একটি অনন্য & বি সেট করে y = ax + b। একটি লাইনে একই & বি মানের সাথে প্রচুর জুড়ি থাকবে, সুতরাং একটি দীর্ঘ রেখাটি শীর্ষ হিসাবে উপস্থিত থাকবে। পোলার র & টেটা স্থানাঙ্কের ক্ষেত্রেও এটি সত্য।

প্রতিটি পয়েন্ট পৃথকভাবে চিকিত্সা করার পরিবর্তে, জোড়া বিন্দু ব্যবহার করুন। আপনি যদি পৃথক তালিকায় সমস্ত (সাধারণত বিরল) পয়েন্টগুলি সংরক্ষণ করতে পারেন তবে এটি আরও ভাল, তবে এটি আবশ্যক নয়।

  1. প্রতিটি জুড়ি নিন এবং তার একটি এবং খ গণনা করুন। (পৃথক মানগুলিকে গোলাকার)
  2. অ্যারেতে নির্দিষ্ট জায়গায় যান এবং 1 যুক্ত করুন।

দীর্ঘ লাইন -> একই এ, বি এর সাথে প্রচুর জোড়া b
বিক্ষিপ্ত পয়েন্টগুলি -> নির্দিষ্ট কোষগুলিতে ছোট গণনা -> আরও বেশি গোলমাল।


এটি দেখার আরেকটি উপায় হ'ল রেডন / প্রজেক্টিভ দৃষ্টিকোণ থেকে।

  • একটি লাইন উচ্চতর স্কোর থাকার কারণে একটি লম্ব "লক সংগ্রহ" -এ দৃ "়ভাবে প্রজেক্ট করবে।
  • যদি লাইন এবং "সংগ্রহের রেখা" এর মধ্যবর্তী কোণটি 90 ডিগ্রি না হয় বা সংগ্রহকারী রেখাটি এই "সংগ্রহের রেখায়" অনুমান করা সমস্ত লাইন পয়েন্টগুলি সংগ্রহ না করে তবে কম স্কোর থাকবে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.