এই পোস্টে, আমরা শিখতে যাচ্ছি, কিভাবে Hough transform নামক একটি কৌশলের সাহায্যে একটি ছবিতে লাইন সনাক্ত করা যায়।
হাউ ট্রান্সফর্ম?
হাফ ট্রান্সফর্ম হল যেকোন সাধারণ আকৃতি সনাক্ত করার একটি বৈশিষ্ট্য নিষ্কাশন পদ্ধতি, যদি আপনি সেই আকৃতিটিকে গাণিতিক আকারে উপস্থাপন করতে পারেন। এটি কিছুটা ভাঙা বা বিকৃত হলেও এটি কোনওভাবে আকৃতি সনাক্ত করতে পরিচালনা করে। আমরা দেখব এটি একটি লাইনের জন্য কিভাবে কাজ করে।
একটি "সহজ" আকৃতি এমন একটি যা শুধুমাত্র কয়েকটি পরামিতি দ্বারা প্রতিনিধিত্ব করা যেতে পারে। উদাহরণ স্বরূপ, একটি রেখাকে শুধুমাত্র দুটি প্যারামিটার (ঢাল, ইন্টারসেপ্ট) দ্বারা উপস্থাপিত করা যেতে পারে এবং একটি বৃত্তের তিনটি প্যারামিটার রয়েছে – কেন্দ্রের স্থানাঙ্ক এবং ব্যাসার্ধ (x,y, r)।
হফ ট্রান্সফর্ম ব্যবহার করে একটি চিত্র থেকে লাইন সনাক্ত করুন
একটি রেখা একটি সমীকরণ দ্বারা প্রতিনিধিত্ব করা যেতে পারে- বা প্যারামেট্রিক আকারে এটিকে উপস্থাপন করা যেতে পারে, যেখানে (ρ) হল উৎপত্তি থেকে রেখার লম্ব দূরত্ব এবং ϴ হল এই লম্ব রেখা এবং কাউন্টারে পরিমাপ করা অনুভূমিক অক্ষ দ্বারা গঠিত কোণ -ঘড়ির কাঁটার দিকে (এই উপস্থাপনাটি OpenCV-তে ব্যবহৃত হয়)। নীচের ছবি দেখুন
সুতরাং যদি রেখাটি উৎপত্তির নিচে দিয়ে যায়, তাহলে এটির একটি ধনাত্মক rho এবং 180 এর কম কোণ হবে। যদি এটি উৎপত্তির উপরে যায়, তাহলে 180-এর বেশি কোণ নেওয়ার পরিবর্তে, কোণটি 180-এর থেকে কম নেওয়া হয় এবং rho-কে নেতিবাচক নেওয়া হয়। যেকোনো উল্লম্ব রেখার 0 ডিগ্রি এবং অনুভূমিক রেখার 90 ডিগ্রি থাকবে৷
সঞ্চয়কারী
যেকোন লাইন এই দুটি পদে (ρ,ϴ) উপস্থাপন করা যেতে পারে। তাই প্রথমে এটি একটি 2D অ্যারে বা অ্যাকিউমুলেটর তৈরি করে (দুটি প্যারামিটারের মান ধরে রাখতে) এবং এটি প্রাথমিকভাবে 0 এ সেট করা হয়। যেখানে সারিগুলি ρ নির্দেশ করে এবং কলামগুলি ϴ নির্দেশ করে। অ্যারের আকার আমাদের প্রয়োজন নির্ভুলতার উপর নির্ভর করে, উদাহরণস্বরূপ, যদি আমাদের 1 ডিগ্রী হতে কোণের নির্ভুলতা প্রয়োজন, আপনার 180টি কলাম এবং ρ প্রয়োজন, চিত্রটির তির্যক দৈর্ঘ্যের সর্বাধিক দূরত্ব এবং ρ হল সর্বাধিক দূরত্ব। চিত্রটির তির্যক দৈর্ঘ্য। তাই এক পিক্সেল নির্ভুলতা এবং সারির সংখ্যা নিলে ছবির তির্যক দৈর্ঘ্য হতে পারে।
বিবেচনা করুন মাঝখানে একটি অনুভূমিক রেখা সহ আমাদের 100*100 এর একটি চিত্র রয়েছে। লাইনের প্রথম বিন্দু নিন, এবং আমরা এর (x,y) মান জানি। এখন সমীকরণে, ϴ=0,1,2,3…180 মানগুলি pu করুন এবং আপনি যে ρ মানটি পাবেন তা পরীক্ষা করুন। প্রতিটি (ρ,ϴ) জোড়ার জন্য, একটি করে বৃদ্ধির মান হল এর সংশ্লিষ্ট (ρ,ϴ) কোষে আমাদের সঞ্চয়কারী। সুতরাং এখন সঞ্চয়কারীতে, সেলটি (50,90) =1 সহ আরও কিছু কোষ। এখন লাইনের দ্বিতীয় স্থান নিন। প্রথম স্থানের জন্য আমরা যেভাবে করেছি একই পদ্ধতিটি পুনরাবৃত্তি করুন। আপনি যে (ρ,ϴ) পাবেন তার সাথে সংশ্লিষ্ট কক্ষে মান বৃদ্ধি করুন। এইবার, সেল (50,90)=2। তাই আমরা আসলে (ρ,ϴ) মানকে ভোট দিচ্ছি। আমরা লাইনের প্রতিটি পয়েন্টের জন্য এই প্রক্রিয়াটি চালিয়ে যাচ্ছি। প্রতিটি স্পটে, সেল (50,90) বৃদ্ধি করা হবে বা ভোট দেওয়া হবে, অন্য কক্ষে ভোট দেওয়া হবে না। এইভাবে, শেষে, সেলের (50,90) সর্বাধিক ভোট থাকবে। সুতরাং আপনি যদি সর্বাধিক ভোটের জন্য সঞ্চয়কারীতে অনুসন্ধান করেন তবে আপনি মান (50,90) পাবেন যা বলে, এই চিত্রটিতে একটি লাইন রয়েছে উৎপত্তি থেকে 50 দূরত্বে এবং 90 ডিগ্রি কোণে। লাইনের জন্য হাফ ট্রান্সফর্ম এভাবেই কাজ করে।
OpenCV-এ Hough Transform
উপরে ব্যাখ্যা করা সমস্ত কিছুই OpenCV ফাংশনে অন্তর্ভুক্ত করা হয়েছে, cv2.HoughLines()। এটি সহজভাবে (ρ,ϴ) মানগুলির একটি অ্যারে প্রদান করে যেখানে ρ কে পিক্সেলে পরিমাপ করা হয় এবং ϴ রেডিয়ানে পরিমাপ করা হয়।
নীচে openCV এবং hough লাইন রূপান্তর ব্যবহার করে লাইন সনাক্তকরণের একটি প্রোগ্রাম রয়েছে৷
নীচে একটি পার্কিং লটের প্রকৃত চিত্র রয়েছে, এবং আমরা হাফ লাইন ট্রান্সফর্ম এবং ওপেনসিভি লাইব্রেরি ব্যবহার করে এই ছবিতে লাইন সনাক্ত করতে যাচ্ছি।
উদাহরণ
import cv2 import numpy as np img = cv2.imread("parkingLot1.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, 75, 150) lines = cv2.HoughLinesP(edges, 1, np.pi/180, 30, maxLineGap=250) for line in lines: x1, y1, x2, y2 = line[0] cv2.line(img, (x1, y1), (x2, y2), (0, 0, 128), 1) cv2.imshow("linesEdges", edges) cv2.imshow("linesDetected", img) cv2.waitKey(0) cv2.destroyAllWindows()
ফলাফল
এবং লাইন সনাক্ত করা হয়েছে---