Xaf almashtirishlari yordamida tasvir belgilarini aniqlash.
Xaf almashtirishlari orqali biz binar (ok-kora) tasvirda parametrli egri chiziklarni topishimiz mumkin. Masalan, to‘g‘ri chiziq, aylana, ellips va x.k. Binar tasvirlarda ikki xil turdagi ranglar katnashadi, bular – fon (oq) va ob’ekt (qora) ranglaridir.
Usulning asosiy g‘oyasi. Xaf almashtirishining asosiy g‘oyasi - bu qaralayotgan nuqtalarga etarlicha katta miqdorda mos tushuvchi yoki shu nuqtalar orqali o‘tuvchi egri chiziqlarni izlashdir. Tekislikda parametrli tenglama orqali berilgan egri chiziqlar oilasini quyidagicha ifodalaymiz:
bu erda – biror funksiya, – egri chiziqlar oilasiga mansub parametrlar, – tekislikdagi koordinatalar. Egri chiziqlar oilasiga mansub parametrlar boshqa bir fazoni tashkil qiladi. Bunda xar bir nuqta kabi aniq parametrlar orqali biror egri chiziqqa mos tushadi.
Fazoda hech bo‘lmaganda bitta egri chiziq yotuvchi katakchaga tasvirda qaralayotgan nuqtalar sonini ko‘rsatuvchi miqdor (xisoblagich) qo‘yish mumkin. Katakchadagi xisoblagichni tekshirib, unga eng ko‘p mos tushgan nuqtalarni, ya’ni egri chiziqlarni topish mumkin.
Misol: Tasvirda to‘g‘ri chiziqni topish. Ma’lumki, tekislikdagi to‘g‘ri chiziqni quyidagi formula yordamida ko‘rsatish mumkin (8.1-rasm).
,
bu erda –koordinatalar boshidan to‘g‘ri chiziqqa o‘tkazilgan perpendikulyarning uzunligi. - OXo‘qi bilan to‘g‘ri chiziqqa o‘tkazilgan perpendikulyar orasidagi burchak bo‘lib, u radianda beriladi ( ). SHunday qilib, to‘g‘ri chiziqlar oilasini ifodalovchi funksiya quyidagi ko‘rinishga ega:
.
8.1-rasm. To‘g‘ri chiziqni parametrli ko‘rinishi.
Tasvirning har bir nuqtasi orqali turli va parametrlar bilan berilgan bir necha to‘g‘ri chiziqlar o‘tkazish mumkin (8.2-rasm). Boshqacha aytganda tasvirning har bir ( ) nuqtasiga ( , ) fazosidagi sinusoydani tashkil qiluvchi nuqtalar to‘plami mos keladi (8.3-rasm). O‘z navbatida ( , ) fazosidagi xar bir nuqta tasvirdagi to‘g‘ri chiziqni tashkil qiluvchi nuqtalar to‘plamiga mos keladi. ( , ) fazosining xar bir ( , ) nuqtasiga to‘g‘ri chiziqda yotuvchi ( ) nuqtalar soniga mos parametrlarni qiymatini qo‘yish mumkin.
Boshlang‘ich va kompyuterdagi ma’lumotlarni tasvirlashning diskretligini xisobga olgan xolda uzluksiz ( , ) fazoni diskret fazoga almashtirish kerak. SHuning uchun ( , ) fazosini to‘g‘ri to‘rtburchaklarga bo‘lamiz. Fazoning har bir katakchasi va ning yaqin qiymatlariga ega bo‘lgan to‘g‘ri chiziqlar to‘plamiga mos keladi. Endi fazoning xar bir katakchasiga mos keluvchi quyidagi parametrni kiritamiz:
.
Katakchaga mos nuktalar soni bo‘lib, ular quyidagi tenglamani qanoatlantiradi:
, bu erda .
Katakchalar o‘lchamini tashlashda quyidagilarni xisobga olish zarur.
Agar katakcha juda katta bo‘lsa, u xolda «to‘g‘ri chiziq» sifatida bir-biridan etarlicha uzoqda yotgan nuqtalar to‘plamini qabul qilish mumkin.
Agar katakchalar juda kichik bo‘lsa, birorta xam to‘g‘ri chiziqni topish imkoniyati bo‘lmasligi mumkin.
Xaf almashtirishlaridan foydalanib tasvirda to‘g‘ri chiziqni qidirish algoritmi umumiy xolda quyidagi ko‘rinishga ega.
Xamma katakchalar parametrlarini nolga tenglaymiz.
Tekshirilayotgan har bir ( ) nuqta uchun va berilgan nuqtadan o‘tuvchi har bir to‘g‘ri chiziq uchunmos parametrlar qiymatini oshirish.
Parametrlarni maksimal qiymatiga mos katakchalarni tanlash.
Eng ko‘p nuqtalardan o‘tgan to‘g‘ri chiziqning parametrlarini ( , ) fazosidagi katakchalarning markaz koordinatasiga teng qilib tanlash.
8.2-rasm. Bitta nuqtadan bir necha to‘g‘ri chiziq o‘tkazish.
8.3-rasm. Sinusoyda.
Agar bir nechta to‘g‘ri chiziqlarni tanlash zarur bo‘lsa, u xolda berilgan to‘g‘ri chiziqqa tegishli nuqtalar sonini ko‘rsatuvchi parametrlarni qiymatini kamayish bo‘yicha tartiblash yoki ( , ) fazosidagi lokal minimumlarni ko‘rib chiqish zarur.
Faraz qilaylik, bizga yuz tasvirida aylana shakliga yaqin bo‘lgan ko‘z qorachig‘ini aniqlash masalasi qo‘yilgan. U holda Xaf almashtirishlari yordamida odamning ko‘z qorachig‘i joylashgan koordinatani aniqlashning bir algoritmi quyidagicha bo‘lishi mumkin.
Dastlab, tasvirda yuz sohasi aniqlanadi va bu soha binar tasvirga o‘tkaziladi. Bizga ma’lumki, ko‘z qorachig‘ining chegaraviy kontur chizig‘i geometrik shakllardan aylanaga ko‘proq mos tushadi. Demak, biz aylana shaklini Xaf almashtirish yordamida izlashimiz mumkin. Agar tanlangan ob’ektda biror P(x,y) ichki nuqta uchun radiusda aylana chizilsa va bu aylana chegarasi ob’ektning chegaraviy nuqtalariga foiz hisobida ko‘proq mos tushsa, u holda shu nuqtani aylana markazi deb olish mumkin. Uni quyidagi formula bo‘yicha ifodalash mumkin.
,
.
bu erda - qidirilayotgan aylana radiusi, – aylanaga mos tushuvchi mavjud chegara nuqtalari soni (uzunligi).
Bunda natijaning etarlicha katta bo‘lsa (masalan, ), u holda qaralayotgan nuqtani radiusli aylana markazi deb olsa bo‘ladi. YA’ni, shu joyda aylana (yoki ko‘z qorachig‘i) topilgan deb hisoblanadi. Algoritm natijasini 8.4-rasmda ko‘rishimiz mumkin.
8.4-rasm. Ajratib olingan yuz tasviri (a), uni binarlashtirish natijasi (b)
hamda Xaf almashtirishi yordamida aniqlangan ko‘zlar koordinatalari (c).
Tasvirda turli geometrik shakllarni ajratishda Xaf almashtirishlarini
qo'llash va ular asosida algorimlar ishlab chiqish
Xaf almashtirishlarining afzalliklari va kamchiliklari
2.2. Tasvirda turli geometrik shakllarni ajratishda Xaf almashtirishlarini
qo'llash va ular asosida algoritmlar ishlab chiqish
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "opencv2/opencv.hpp"
#include "math.h"
#include "qdebug.h"
#include
#include
using namespace cv;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
void MainWindow::on_pushButton_clicked()
{
// Read the image as gray-scale
Mat img=imread("d:/5-tajriba.png", IMREAD_COLOR);
// Convert to gray-scale
Mat gray;
cvtColor(img,gray, COLOR_BGR2GRAY);
// Store the edges
Mat edges;
// Find the edges in the image using canny detector
Canny(gray, edges, 50, 200);
// Create a vector to store lines of the image
vector lines;
// Apply Hough Transform
HoughLinesP(edges, lines, 1, CV_PI/180, 125, 10, 250);
// Draw lines on the image
for (size_t i=0; i{
Vec4i l=lines[i];
line(img, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(255, 0, 0), 3, 0);
}
// Show result image
imshow("Result Image", img);
}
|