Hàm tính tọa độ Barycentric củ aM đối với ba điểm P1, P2, P3

Một phần của tài liệu khôi phục hình dạng ảnh và ứng dụng (Trang 42 - 49)

3. Bố cục của luận văn

3.2.1.2.1. Hàm tính tọa độ Barycentric củ aM đối với ba điểm P1, P2, P3

Mục đích: Với mỗi điểm ảnh M ta sẽ tính toán giá trị tọa độ theo hệ tọa độ Barycentric đối với ba điểm P1, P2, P3.

Ý tưởng: Dựa vào công thức tính tọa độ Barycentric để xây dựng hàm. Hàm này trả về giá trị tọa độ u, v, w của điểm M.

BOOL CThuView::Barycentric(CPoint M, CPoint P1, CPoint P2, CPoint P3, double &u, double &v, double &w)

{

double D= double ((P1.y- P3.y) *( P1.x - P2.x)- (P1.x- P3.x)*(P1.y-P2.y)); if (D= =0) return FALSE; v=((P1.y-P3.y)*(P1.x-M.x)-(P1.x-P3.x)*(P1.y-M.y))/D; w=((P1.y-M.y)*(P1.x-P2.x)-(P1.x-M.x)*(P1.y-P2.y))/D; u=1-v-w; return TRUE; }

3.2.12.2. Hàm kiểm tra ba điểm A, B, C có chứa điểm P hay không? Mục đích: Kiểm tra tam giác ABC có chứa điểm P hay không?

Ý tưởng: Dùng con trỏ Cpoint để khai báo cho các điểm P, A, B, C. Để thực hiện kiểm tra thì phải xét tọa độ P.x và P.y của điểm P có nằm trong các khoảng tọa độ tƣơng ứng theo x, y của A, B, C hay không? Nếu tọa độ P.x và P.y nhỏ hơn hoặc lớn hơn A.x, B.x, C.x hoặc A.y, B.y, C.y thì tam giác ABC không chứa P.

Lưu ý: Khi kiểm tra 3 điểm A, B, C đã chứa điểm P thì hàm này gọi luôn hàm tính tọa độ Barycentric để kiểm tra điều kiện tồn tại của tọa độ này. Đó là, tọa độ theo u, v, w  0.

BOOL CThuView:: IsBeLongToTraingle(CPoint P, CPoint A, Cpoint B, CPoint C)

double u,v,w;

if ((P.x > A.x && P.x > B.x && P.x > C.x)|| (P.x < A.x && P.x < B.x && P.x < C.x) || (P.y > A.y && P.y > B.y && P.y > C.y) || (P.y < A.y && P.y < B.y && P.y < C.y)) return FALSE;

if ( Barycentric(P,A,B,C,u,v,w)&& u>=0&& v>=0&& w>=0) return TRUE;

return FALSE; }

3.2.1.2.3. Hàm tính khoảng cách giữa hai điểm P và Q

Mục đích: Tính khoảng cách giữa hai điểm ảnh p, q. Hàm này đƣợc sử dụng để tìm ba điểm đặc trƣng.

Ý tưởng: Dựa theo công thức toán học:

Khoảng cách(p,q)= 2 2

) (

)

(xpxqypyq

Tuy nhiên, do đặc thù của thuật toán đƣợc xây dựng, hàm này chỉ đƣợc sử dụng để tìm 3 điểm lân cận với M, có tổng khoảng cách đến M nhỏ nhất nên để giảm khối lƣợng các phép tính, hàm chỉ xây dựng theo công thức sau:

Khoảngcách(p,q) = (xp – xq)2 + (yp - yq)2

double CThuView::Khoangcach(CPoint p, CPoint q) {

return ((p.x-q.x) * (p.x-q.x) + (p.y-q.y) * (p.y-q.y)); }

3.2.1.2.4. Hàm tìm tập điểm đặc trưng trên ảnh trung gian.

Mục đích: Tìm tập điểm đặc trƣng trên ảnh trung gian dựa theo tập điểm đặc trƣng đã đƣợc chọn trên ảnh gốc và ảnh đích.

Ý tưởng: Dựa vào công thức tính tọa độ của điểm đặc trƣng trung gian khi biết tọa độ của của cặp điểm đặc trƣng tƣơng ứng trên hai ảnh và một hệ số r[0,1].

void CThuView::TapdiemDTtrunggian(double r, CPoint *P, int n) {

lMin=1000; rMax=0; tMin=1000; bMax=0;

for(int i=1; i<=n; ++i) {

P[i].x= int (DT11[i].x *(1-r) + DT22[i].x * r); P[i].y= int (DT11[i].y *(1-r) + DT22[i].y * r); if(P[i].x>rMax)rMax = P[i].x; if(P[i].x<lMin)lMin = P[i].x; if(P[i].y>bMax)bMax = P[i].y; if(P[i].y<tMin)tMin = P[i].y; } } 3.2.1.2.5. Hàm tìm ba điểm đặc trưng

Mục đích: Tìm 3 điểm đặc trƣng của điểm ảnh M bất kỳ trên ảnh trung gian. Ba điểm đặc trƣng này có chỉ số tƣơng ứng với các điểm đặc trƣng trên ảnh gốc và ảnh đích. Từ đó, ta có thể tính đƣợc tọa độ Barycentric của M1, M2 tƣơng ứng với M trên ảnh gốc và đích.

Ý tưởng: Tìm ba điểm đặc trƣng chứa M (theo hàm IsToBeLongToTriang) mà có khoảng cách đến M nhỏ nhất và bé hơn một ngƣỡng.

BOOL CThuView::Tim3diemDT(CPoint M, int &a, int &b, int &c) {

double h;

BOOL timthay = FALSE; int u,v,k; int dem=0; for (u=1;u<=ndiemDT;++u) { for (v=1;v<=ndiemDT;++v) if(v!=u) { for (k=1;k<=ndiemDT;++k) if(k!=u && k!=v) { if (IsBeLongToTraingle(M,DT[u],DT[v],DT[k])==TRUE) { h=Khoangcach(M,DT[u])+Khoangcach(M,DT[v])+Khoangca ch(M,DT[k]); if (h<nguong) { nguong = h; a=u; b=v; c=k; timthay=TRUE; ++dem; } } }

} }

return timthay; }

3.2.1.2.6. Hàm thực hiện nội suy ảnh.

Mục đích: Từ hai ảnh đầu vào tạo ra ảnh trung gian theo mong muốn.Ví dụ: Từ hai ảnh đầu vào lúc 10 tuổi và lúc 50 tuổi của cùng một ngƣời, ta lấy ra ảnh của ngƣời đó lúc 30 tuổi, 40 tuổi,…

Ý tưởng: Với mỗi điểm M trên ảnh trung gian, tìm 3 điểm đặc trƣng của M và tính toán tọa độ Barycentric của nó. Sau đó tính tọa độ của các điểm ảnh M1, M2 trên ảnh gốc và ảnh đích có cùng tọa độ Barycentric với M và gán giá trị màu của điểm M theo giá trị màu của M1, M2(theo những công thức đã đƣợc xây dựng trong phần thuật toán)

void CThuView::Noisuy(double r) {

CThuDoc *pDoc = (CThuDoc *)GetDocument(); fipWinImage *pImg1 = pDoc->image_origin1; fipWinImage *pImg2 = pDoc->image_origin2; fipWinImage *pImg = pDoc->image_final; int a, b, c; CPoint A, B, C; double x1, x2, x3; CPoint M, M1, M2; double u, v, w; TapdiemDTtrunggian(r, DT, ndiemDT); RGBQUAD rgb1, rgb2, rgb;

for (int i=1; i<iH; ++i) for (int j=1; j<iW; ++j)

{ M.x=iH-i-1; M.y=j; If(IsInRect(M.x,M.y,lMin,tMin,rMax,bMax)&& Tim3diemDT(M,a,b,c)) { if (Barycentric(M,DT[a],DT[b],DT[c],u,v,w)) { x1=u; x2=v; x3=w; M1.x= int(DT11[a].x*x1+DT11[b].x*x2 + DT11[c].x*x3); M1.y=int(DT11[a].y*x1+DT11[b].y* x2 + DT11[c].y*x3); M2.x=int(DT22[a].x*x1+DT22[b].x* x2 + DT22[c].x*x3); M2.y=int(DT22[a].y*x1+DT22[b].y* x2 + DT22[c].y*x3); // Noi suy mau sac

pImg1->getPixelColor(M1.y,M1.x,&rgb2); pImg2->getPixelColor(M2.y,M2.x,&rgb1);

rgb.rgbRed=(BYTE)(rgb1.rgbRed*r + rgb2.rgbRed*(1-r)); rgb.rgbGreen=(BYTE)(rgb1.rgbGreen*r+rgb2.rgbGreen*(1-r)); rgb.rgbBlue = (BYTE)(rgb1.rgbBlue*r + rgb2.rgbBlue*(1-r)); pImg->setPixelColor(M.y,M.x,&rgb); } } } Invalidate(); }

Mục đích: Hỗ trợ ngƣời dùng có thể lƣu lại tập các điểm đặc trƣng đã chọn trên hai ảnh đầu vào, để có thể sử dụng ở lần nội suy tiếp theo.

Ý tưởng: Khai báo một file f để mở tệp data.txt để đƣa lần lƣợt các điểm đặc trƣng trong tập đặc trƣng vào file.

void CThuView::OnButtonLuu() { CFile f; f.Open("data.txt",CFile::modeCreate|CFile::modeWrite); CArchive ar(&f,CArchive::store); ar<< ndiemDT; for(int i=1;i<=ndiemDT;++i)

ar << DT1[i].x << DT1[i].y << DT2[i].x << DT2[i].y; ar.Close();

f.Close(); }

3.2.1.2.8. Hàm đọc tập các điểm đặc trưng.

Mục đích: Hỗ trợ ngƣời dùng có thể đọc đƣợc tập điểm đặc trƣng đã lƣu trên file.

Ý tưởng: Mở file có tên là data.txt để đọc lần lƣợt từng điểm đặc trƣng có trên file. Đồng thời hiện tập đặc trƣng lên hai ảnh và trong danh sách tọa độ bên phải. void CThuView::OnButtonDoc() { CFile f; f.Open("data.txt",CFile::modeRead); CArchive ar(&f,CArchive::load); ar>>ndiemDT; for(int i=1;i<=ndiemDT;++i)

ar >> DT1[i].x >> DT1[i].y >> DT2[i].x >> DT2[i].y; CMainFrame *frm =(CMainFrame *) GetParentFrame(); CRightView *pView = frm->getRightView();

int x,y; for(i=1;i<=ndiemDT;++i) { DT11[i]=DT1[i]; DT22[i] = DT2[i]; x = DT11[i].x; y = DT11[i].y; DT11[i].x = (iH-y-1); DT11[i].y = x; x = DT22[i].x; y = DT22[i].y; DT22[i].x = (iH-y-1); DT22[i].y = x; pView->ThemToaDo(DT1[i].x,DT1[i].y,DT2[i].x,DT2[i].y); } ar.Close(); f.Close(); Invalidate(); }

Một phần của tài liệu khôi phục hình dạng ảnh và ứng dụng (Trang 42 - 49)