গোলমাল চিত্রের ডেটাতে একটি চেনাশোনা সনাক্তকরণ


17

আমার একটি চিত্র রয়েছে যা দেখতে নীচের মত দেখাচ্ছে: এখানে চিত্র বর্ণনা লিখুন

আমি বৃত্তের ব্যাসার্ধ (বা ব্যাস) সন্ধান করার চেষ্টা করছি। আমি বিজ্ঞপ্তি হফ ট্রান্সফর্ম (ম্যাট্লাবের মাধ্যমে imfindcircles(bw,[rmin rmax],'ObjectPolarity','bright')) ব্যবহার করার চেষ্টা করেছি , এবং একটি বৃত্ত বা উপবৃত্তের সাথে ফিট করে (ঘরে তৈরি ফাংশন যা কম গোলমাল সংক্রান্ত তথ্যের জন্য বেশ ভালভাবে কাজ করে, নীচে দেখুন)।

আমি একটি পরিষ্কার বৃত্ত পেতে কিছু চিত্র প্রক্রিয়াকরণের চেষ্টা করেছি, উদাহরণস্বরূপ, নীচে দেখুন:

se = strel('disk', 2);
bw = imdilate(bw, se);
bw = bwareaopen(bw,100000); 
bw =  edge(bw); 

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

যাইহোক, আমি যখন প্রক্রিয়াজাত চিত্রটি হয় কৌশলগুলিতে ফিড করি (Hough এবং বৃত্ত ting উপবৃত্ত ফিটিং) তাদের উভয়ই একটি শালীন পদ্ধতিতে বৃত্তটি সনাক্ত করতে পরিচালনা করে না।

আমি যে বৃত্ত ফাইন্ডার লিখেছি তার একটি কোড স্নিপেট এখানে রয়েছে (মতলব) [সারি কোল] = সন্ধান (বিডব্লু); কনট্যুর = bwtraceboundary (বিডাব্লু, সারি (1), কল (1)], 'এন', সংযোগ, সংখ্যা_পয়েন্ট);

    x = contour(:,2);
    y = contour(:,1);

    % solve for parameters a, b, and c in the least-squares sense by
    % using the backslash operator
    abc = [x y ones(length(x),1)] \ -(x.^2+y.^2);
    a = abc(1); b = abc(2); c = abc(3);

    % calculate the location of the center and the radius
    xc = -a/2;
    yc = -b/2;
    radius  =  sqrt((xc^2+yc^2)-c);

বিকল্প পদ্ধতির প্রশংসা করা হবে ...


প্রচুর রূপান্তর কোনও বৃত্তের সন্ধান করে, ভরাট ডিস্ক নয়। ভরাট ডিস্কটিকে ফাঁকা বৃত্তে রূপান্তর করতে আপনাকে প্রথমে প্রান্ত সনাক্তকরণ করতে হবে। আপনার চেনাশোনাগুলির বৈশিষ্ট্যগুলি কী? আকার ধ্রুবক? তারা কি উপবৃত্ত হতে পারে? বিন্দু কি আলাদাভাবে বিতরণ করা যায়?
এন্ডোলিথ

আমি চেষ্টা করেছি (সম্পাদিত উদাহরণ দেখুন), এটি হয় খুব গোলমাল বা, পর্যাপ্ত বিজ্ঞপ্তি নয়? অতিরিক্ত হিসাবে, আকারটি ধ্রুবক এবং ক্যামেরার কোণ ত্রুটির কারণে এটিতে মিনিটবৃক্ষ হতে পারে (যদিও বাস্তবে এটি নিখুঁতভাবে বিজ্ঞপ্তিযুক্ত উইন্ডো)।
bla

যদি আকার এবং আকৃতি স্থির থাকে, আপনি মূল ডট চিত্রের সাথে একটি ভরাট ডিস্ক টেম্পলেটটির ক্রস-সম্পর্কের মতো কিছু চেষ্টা করতে পারেন
এন্ডোলিথ

আমার উত্তরের পাশাপাশি, আমি মনে করি আপনি নিজের চিত্র প্রক্রিয়াকরণ পাইপের খুব পরে পর্যায়ে এটি করার চেষ্টা করছেন। আপনি কি আমাদের সমস্যা সম্পর্কে আরও বলতে পারেন, এবং কিছু পূর্ববর্তী পদক্ষেপগুলি প্রদর্শন করতে পারেন?
আন্দ্রে রুবস্টেইন

উত্তর:


13

এখানে আমার সমাধানটি দেওয়া হয়েছে, এটি @ যোদার ধারণার নিকটে, তবে আমি কয়েকটি পদক্ষেপ পরিবর্তন করেছি।

  • সমস্ত পিক্সেলকে চিহ্নিত করুন যে তাদের 7x7 পাড়ায় কমপক্ষে 6 পিক্সেল রয়েছে
  • সমস্ত ব্লব সরান, তবে বৃহত্তম
  • গর্ত পূরণ করুন
  • প্রান্ত সনাক্তকরণ প্রয়োগ করুন
  • হফ ট্রান্সফর্ম ব্যবহার করে বৃত্তটি সন্ধান করুন

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

এখানে প্রাসঙ্গিক মাতলাব কোড। আমি আমার কোডে। M ফাইলের চেনাশোনাগুলির জন্য Hough রূপান্তর ব্যবহার করছি ।

function FindCircle()
    close all;
    im = imread('C:\circle.png');
    im = im(:,:,2);

    ims = conv2(double(im), ones(7,7),'same');
    imbw = ims>6;
    figure;imshow(imbw);title('All pixels that there are at least 6 white pixels in their hood');

    props = regionprops(imbw,'Area','PixelIdxList','MajorAxisLength','MinorAxisLength');
    [~,indexOfMax] = max([props.Area]);
    approximateRadius =  props(indexOfMax).MajorAxisLength/2;

    largestBlobIndexes  = props(indexOfMax).PixelIdxList;
    bw = false(size(im));
    bw(largestBlobIndexes) = 1;
    bw = imfill(bw,'holes');
    figure;imshow(bw);title('Leaving only largest blob and filling holes');
    figure;imshow(edge(bw));title('Edge detection');

    radiuses = round ( (approximateRadius-5):0.5:(approximateRadius+5) );
    h = circle_hough(edge(bw), radiuses,'same');
    [~,maxIndex] = max(h(:));
    [i,j,k] = ind2sub(size(h), maxIndex);
    radius = radiuses(k);
    center.x = j;
    center.y = i;

    figure;imshow(edge(bw));imellipse(gca,[center.x-radius  center.y-radius 2*radius 2*radius]);
    title('Final solution (Shown on edge image)');

    figure;imshow(im);imellipse(gca,[center.x-radius  center.y-radius 2*radius 2*radius]);
    title('Final solution (Shown on initial image)');

end

1
এখানে হাফ রূপান্তর কী করছে যা নীল বৃত্তটি সমাধান করে এবং এটি সন্ধান করে? এটি কি চিত্রের বিভিন্ন অবস্থানে বিভিন্ন রেডিয়ির বহু চেনাশোনাগুলি প্রজেক্ট করছে এবং এটি সবচেয়ে ভাল ফিট করে এমন একটি সন্ধান করছে?
স্পেসি

@ মোহাম্মদ, এটি হ'ল সাধারণ বৃত্ত সনাক্তকারী। এটি বিনিং এবং ভোটদান ব্যবহার করে।
আন্দ্রে রুবস্টেইন

আপনি এই উত্তরের প্রথম পদক্ষেপের পরে দ্রুত রেডিয়াল প্রতিসম ট্রান্সফর্ম (এফআরএসটি) ব্যবহার করতে পারেন।
জিনেডেস্পেজ

10

ইমেজ প্রসেসিং ব্যবহার করে এটি করা মোটামুটি সোজা। নিম্নলিখিতটি গণিতের ধারণার একটি প্রমাণ । আপনাকে এটি ম্যাটল্যাবে অনুবাদ করতে হবে।

  • প্রথমে অক্ষগুলি ছাঁটাই করুন এবং এর কেবল চিত্রের অংশটি রাখুন। আমি এই পরিবর্তনশীল কল img
  • চিত্রটি বাইনারি করুন এবং এটি দ্বৈতকরণ করুন, তারপরে একটি ফিলিং ট্রান্সফর্ম হবে। আমি বিপথগামী ছোট ছোট উপাদানগুলিও মুছে ফেলি যা মূল ব্লবের সাথে সংযুক্ত নয়। এটি আপনাকে নিম্নলিখিতগুলির মতো কিছু দেবে:

    filled = Binarize@img ~Dilation~ 3 // FillingTransform // DeleteSmallComponents
    

  • এরপরে, এই ব্লবের সেন্ট্রয়েড এবং ব্লবটির সমতুল্য ডিস্ক ব্যাসার্ধের সন্ধান করুন (ওপেনসিভি, ম্যাটল্যাব সবার কাছে এটি করার জন্য সমান কমান্ড রয়েছে)

    {center, radius} = 1 /. ComponentMeasurements[filled, {"Centroid", "EquivalentDiskRadius"}]
    
  • এটাই! এটি কীভাবে খাপ খায় তা দেখতে এখন মূল চিত্র এবং উপরের কেন্দ্র এবং ব্যাসার্ধের সাথে একটি চক্র তৈরি করুন:

    Show[img, Graphics[{Red, Circle[center, radius]}]]
    


দুর্দান্ত উত্তর! আপনি দয়া করে প্রসারণ এবং ভরাট রূপান্তর প্রসারিত করতে পারেন?
স্পেসি

@ মোহাম্মদ ডিলেশন একটি প্রাথমিক অপারেশন এবং উইকি নিবন্ধ দ্বারা সহজেই ব্যাখ্যা করা হবে। "গর্তগুলি" বা অন্য কথায়, উচ্চ মানের মানের পিক্সেল দ্বারা বেষ্টিত পিক্সেলের সেটগুলি পূরণ করে ট্রান্সফর্ম পূরণ হয়। "আরো তথ্য" বিভাগটি দেখুন এখানে
আর্কাইভ

আহ দুঃখিত, আমি ভুল টাইপ করেছি। ডিলিয়েশন ট্রান্সফর্মের সাথে আমি কিছুটা পরিচিত, আমি ভাবছিলাম আসলে আপনি 'ফিলিং ট্রান্সফর্ম' প্রসারিত করতে পারেন কিনা। এটি সঠিকভাবে কোন নিয়মটি ব্যবহার করছে? আমি এর সাথে সম্পর্কিত তথ্য খুঁজে পাচ্ছি না। সম্ভবত এটি অন্য নামে যায়?
স্পেসি

@ ইয়োদা, উত্তরের জন্য আপনাকে ধন্যবাদ, তবে আপনি যদি প্রশ্নটি পড়েন তবে আপনি লক্ষ্য করবেন যে আমি বিসারণ, এবং ফিট করার চেষ্টা করেছি। প্রান্তগুলি সনাক্ত করার আগে উত্পন্ন চিত্রটি আপনার অনুরূপ। আমি কিছুটা ফিট পাই, এটি সঠিক নয়। আপনার ফিটের জন্যও এটি একই, আপনি দেখতে পারেন যে লাগানো বৃত্তের শীর্ষ অংশটি খুব বড়, সম্ভবত আপনি বৃত্তের উপরের অংশের গোলমাল পয়েন্টটি বিবেচনায় রাখেন। আমি একটি উপবৃত্তের সাথে ফিট করার চেষ্টাও করেছি (প্রশ্নে বর্ণিত হিসাবে), সমস্যাটি হ'ল ফিট যথেষ্ট নয় isn't আমি মনে করি সম্ভবত আরও ভাল উপায় হ'ল এটি করার জন্য চেনাশোনাটির আরও ভাল অংশটি (একটি তোরণ) ব্যবহার করা।
bla

@ নেট আপনি "লাগানো বৃত্তের শীর্ষ অংশ" এবং "বৃত্তের আরও ভাল অংশ" বলতে কী বুঝছেন তা আমি বুঝতে পারি না। আপনি বিভিন্ন মেট্রিক ব্যবহার করতে পারেন ... বাউন্ডিং বাক্স, বড় অক্ষের দৈর্ঘ্য, ছোট অক্ষের দৈর্ঘ্য, সেন্ট্রয়েড থেকে গড় দূরত্ব, সেন্ট্রয়েড থেকে মাঝারি দূরত্ব ইত্যাদি It এগুলি সমস্ত কি আপনি চান তার উপর নির্ভর করে।
Lorem Ipsum
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.