در مفاهیم بینایی ماشین، واژه های گوشه ها (Corner) و نقاط مورد علاقه (Points of Intrest) تا اندازه همسان یکدیگر هستند. مفهوم نقطه های مورد علاقه تا اندازه ای شبیه به همان مفهوم ناحیه مورد علاقه دارد و بدین گونه است که به جای در نظر گرفتن همه تصویر و پردازش همه پیکسل های آن، تنها نقطه هایی از تصویر را برگزینیم و سپس پردازش محلی، تنها بر روی همین نقطه ها انجام شود. از دسته کاربردهای پردازش محلی روی برخی نقطه ها، می توان به بررسی انطباق دو تصویر، تشخیص اشیا و ردیابی اشاره کرد.

یک نقطه علاقه یک نقطه در تصویر است که از موقعیت مناسبی برخوردار است و می توان آن را به خوبی تشخیص داد. این بدان معنی است که یک نقطه علاقه می تواند گوشه ای باشد اما می تواند مثلا یک نقطه مشتق شده (جدا شده) از حداکثر یا حداقل شدت محلی یا انتهای خط یا نقطه بر روی منحنی باشد که انحنای محلی حداکثر باشد. از دسته کاربردهای پردازش محلی روی برخی نقطه ها، می توان به بررسی انطباق دو تصویر، تشخیص اشیا و ردیابی اشاره کرد.

الگوریتم Harris برای پیدا کردن گوشه ها

در نوشته مفهوم ویژگی ها در تصویر گفتیم که یافتن گوشه ها در هر دو راستا (افقی و عمودی) انجام می شود ولی در یافتن گوشه، تنها راستای افقی بررسی می شود. یک گوشه را می توان به عنوان تقاطع دو لبه تعریف کرد. همچنین یک گوشه را می توان به عنوان نقطه ای تعریف کرد که برای این نقطه، دو لبه بر روی محور (افقی و عمودی) متفاوت در نزدیکی همسایگی نقطه هست.

در عمل، بیشتر روش های که اصطلاح تشخیص گوشه نامیده می شوند می توانند نقاط مورد علاقه را نیز تشخیص دهند و در حقیقت، اصطلاح “گوشه” و “نقطه مورد علاقه” کم و بیش به طور متقابل و به جای یکدیگر به کار می روند. به عنوان یک نتیجه گیری، اگر تنها گوشه ها شناسایی شوند، نیاز است تا یک تحلیل محلی از نقاط مورد علاقه شناسایی شده انجام شود تا مشخص شود که کدام یک از گوشه های واقعی هستند.

الگوریتم Harris یکی از الگوریتم های بینایی ماشین برای تشخیص گوشه ها است که در واقع می توانیم آن را یک Feature Detector نیز بنامیم. نخستین چیزی که برای انجام این الگوریتم باید انجام دهیم، برگزیدن یک ماتریس بسیار کوچک تر از اندازه خود تصویر است که اصطلاحا آن را window می نامیم.

همچنین در نوشته مفهوم ویژگی ها در تصویر گفتیم که گوشه ها ناحیه هایی در تصویر هستند که دارای شدت زیادی در هر دو جهت عمودی و افقی هستند. شکل زیر معادله ریاضی الگوریتم Harris را نشان می دهد و انگیزه از این معادله پیدا کردن تفاوت در شدت جابجایی (u, v) در هر دو راستای افقی و عمودی است.

window مفهومی همانند ماتریس های فیلتر دارد و از این رو بر روی تصویر حرکت می کند (شیف داده می شود). شکل زیر این شیفت داده شدن را نشان می دهد. اگر ماتریس window روی ناحیه تخت (Flat) باشد، شدت رنگ در هر دو راستا تغییر نمی کند. در دیگری که گوشه (Corner) است، باز هم شدت رنگ در هر دو راستا تغییر نمی کند بلکه تنها در یکی از راستاها تغییر می کند. با توجه به اینکه در گوشه ها به دنبال تغییر شدت روشنایی در هر دو راستا هستیم، پس سومین شکل زیر این را نشان می دهد.

اکنون دوباره به معادله بالا باز می گردیم که در آن window function همان ماتریس و u و v نیز شیف ها در دو راستا هستند. I مقدار پیکسلی از همان تصویری است که ماتریس window بر روی آن اعمال می شود. برای پیدا کردن گوشه، تابع E با توجه به u و v بیشینه (Maximaize) شود.

با اعمال بسط تیلور به معادله ۱ و صرف نظر از عملیات های ریاضی پیچیده، در پایان به معادله زیر (معادله ۲) می رسیم که سومین معادله، جاگزین M در معادله ۲ می شود. در معادله سوم (همان عبارت M)، عبارت های Ix و Iy به ترتیب برابر با مشتق تصویر در دو راستای x و y هستند.

سپس برابر با معادله زیر یک امتیاز (Score) شناسانده می شود و انگیزه از این امتیاز یا معادله R آن است که تشخیص داده شود آیا ماتریس window می تواند شامل یک گوشه باشد. توجه کنید که ماتریس در هر گام یکی از ناحیه تخت، لبه و گوشه را تشخیص می دهد. شکل زیر عبارت های (det(M و (trace(M را نشان می دهند و از میان آنها نمادهای lambda1 و lamda2 شماره های ایگن (Eigen) هستند.

بنابراین مقادیر این دو مقدار ایگن مشخص می کند که ناحیه آیا گوشه یا لبه یا تخت است. زمانی مقدار قدر مطلق R (یا |R|) کوچک می شود که، مقدارهای lambda1 و lambda2 هر دو کوچک باشند، پس از این رو ناحیه تخت خواهد بود. اگر مقدار یکی از این دو مقدار ایگن کوچک و دیگری بزرگ باشد، پس ناحیه لبه خواهد بود. اگر هر دو مقدار ویژه بزرگ باشند، پس ناحیه گوشه خواهد بود. شکل زیر این سه مورد را نشان می دهد.

تابع ()harrisCorner در OpenCV

آرگومان یکم تابع ()harrisCorner، یک تصویر خاکستری است، بنابراین در کد زیر به کمک تابع ()cvtColor تصویر وروی، به تصویر خاکستری تبدیل می شود. در بند پسین (بعدی) همه مقدارهای پیکسل های تصویر خاکستری به گونه float32 دگرگون می شوند. توجه کنید تصویر ورودی به تابع ()np.float32 یک تصویر خاکستری تک کانالی است.

آرگومان دوم تابع blockSize برابر با اندازه همسایگی (Neighbourhood) مورد نظر است. پارامتر سوم ksize برابر با اندازه کرنل یا ماتریس window است که از آن برای انجام محاسبه فیلتر سوبل (Sobel) کمک گرفته می شود. پارامتر چهارم k اندازه آزادی است که در واپسین معادله این نوشته (امتیاز R) به کار می رود. در کد زیر آن برابر با 0.04 گزیده شده است. مشخص کردن مقدار k کمی دشوار است ولی معمولا میان بازه 0.05 تا 0.5 خواهد بود.