Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên Trang 11 / 25 Để dễ hiểu, phần dưới đây sẽ minh hoạ thêm về giải thuật này: Ma trận ảnh vào Mặt nạ a11 a12 a13 a1n a21 a22 a23 a2n a31 a32 a33 a3n m11 m12 m13 m21 m22 m23 m31 m32 m33 Ma trận ảnh ra sau khi nhân chập b11 b12 b13 b1n b21 b22 b23 b2n b31 b32 b33 b3n Trong đó: b22=(a11*m11)+ (a12*m12)+ (a12*m13)+ (a21*m21) + (a22*m22) + (a23*m23) + (a31*m31)+ (a32*m32)+ (a33*m33). Các giá trị nằm trên đường viền được gán =0 (hay giá trị màu nền). (b11,b12, b1n,b11 bn1,b1n bnn, bn1 bnn) Đây là công thức tính Gx và Gy Để tính giá trị điểm ảnh đầu ra, sử dụng công thức: G=|Gx|+ |Gy| 2.3.2. Phương pháp dò biên theo kỹ thuật Laplace Kỹ thuật Laplace dò biên theo cách tính xấp xỉ đạo hàm bậc hai dựa trên một mặt nạ. Chương trình sử dụng mặt nạ H2 trong cách dò biên theo kỹ thuật Laplace. -1 -1 -1 H2= -1 8 -1 -1 -1 -1 Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên Trang 12 / 25 Gọi G là ma trận điểm thu được sau khi nhân chập ma trận điểm ảnh (của ảnh cần tìm biên)với mặt nạ H2. G chính là ma trận điểm ảnh chứa các đường biên cần tìm. Thuật toán dò biên theo phương pháp Gradient như sau: Đầu vào: ma trận ảnh cần tìm biên: mặt nạ H2 Đầu ra: Một ma trận ảnh (chứa các đường biên được tìm thấy). Giải thuật // Laplace Algorithm For (mỗi điểm ảnh của ảnh) if(Nếu điểm ảnh nẳm trên đường viền ảnh) Gán giá trị các điểm ảnh trên đường viền ảnh =0 (hoặc bằng màu nền ảnh). else { - Tính xấp xỉ Laplace G: nhân chập với mặt nạ I1 - Nếu giá trị điểm ảnh lớn hơn chỉ số màu của ảnh thì gán giá trị ảnh là giá trị màu lớn nhất. } 2.3.3. Phương pháp dò biên gián tiếp Dựa trên kỹ thuật phân vùng ảnh, Phương pháp này dò biên theo sự thay đổi mức xám màu của ảnh. Nếu những điểm ảnh nào có cùng màu hoặc có màu khác nhưng khoảng cách màu nằm trong phạm vi cho phép, đồng thời nằm kề nhau sẽ tạo thành một vùng. Định nghĩa khoảng cách màu: Khoảng cách màu là một khái niệm để chỉ sự khác nhau về giá trị màu của các điểm ảnh. Giả sử a và b là 2 giá trị màu của 2 điểm ảnh. Khoảng cách màu d của a và b được tính như sau: d(a,b)=|Ra-Rb| + |Ga-Gb| + |Ba-Bb| Trong đó Ra: là giá trị màu đỏ tại điểm ảnh Ga: là giá trị màu xanh (green)tại điểm ảnh Ba: là giá trị màu xanh da trời (blue) tại điểm ảnh. Nếu khoảng cách màu d=0 thì 2 điểm ảnh đó có cùng màu. Đường biên giữ các vùng chính là các đường biên cần tìm. Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên Trang 13 / 25 Thuật toán tìm đường biên dựa trên sự biến thiên giá trị màu của các điểm ảnh. Đầu vào: Ma trận điểm ảnh, khoảng cách màu tối thiểu Đầu ra: Ma trận điểm ảnh mới (chứa các đường biên tìm thấy). Giải thuật: For (mỗi điểm ảnh của ảnh) { - Tính khoảng cách màu của điểm ảnh với các điểm ảnh lân cận: Tính theo 8 hướng của điểm ảnh if(Nếu có một khoảng cách màu lớn hơn khoảng cách màu cho phép) { - Ghi nhận điểm ảnh này là một điểm biên mới. } } 2.4. Chương trình 2.4.1. Giao diện và các chức năng chính Màn hình chính khi chạy có giao diện như sau: Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên Trang 14 / 25 2.4.2. Chức năng Gradient Bao gồm hai chức năng: o Sobel o Prewitt Kết quả dò biên theo kỹ thuật Gradient với toán tử Sobel Kết quả dò biên theo kỹ thuật Gradient với toán tử Sobel Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên Trang 15 / 25 Nhận xét: Khi áp dụng hai toán tử này cho ta cùng một kết quả tương tự nhau Phương pháp này tạo nên đường biên rất đậm 2.4.3. Chức năng Laplace Chức năng này bao gồm chức năng Laplace-h2: sử dựng mặt nạ H2 Kết quả dò biên theo kỹ thuật Laplace Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên Trang 16 / 25 2.4.4. Chức năng dò biên gián tiếp(Indirect Method) Kết quả dò biên theo phương pháp này Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên Trang 17 / 25 2.5. Một số hàm và thủ tục chính void CDemo3Doc::OnMethodSobel() { // TODO: Add your command handler code here if (image==0) return; if (!image->IsValid()) return; long Gx[3][3]; long Gy[3][3]; Gx[0][0] = -1; Gx[0][1] = 0; Gx[0][2] = 1; Gx[1][0] = -1; Gx[1][1] = 0; Gx[1][2] = 1; Gx[2][0] = -1; Gx[2][1] = 0; Gx[2][2] = 1; Gy[0][0] = -1; Gy[0][1] = -1; Gy[0][2] = -1; Gy[1][0] = 0; Gy[1][1] = 0; Gy[1][2] = 0; Gy[2][0] = 1; Gy[2][1] = 1; Gy[2][2] = 1; Gradient(Gx,Gy); // image->Filter(kernel,3,16,0); UpdateAllViews(NULL); } Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên Trang 18 / 25 bool CDemo3Doc::Gradient(long Gx[3][3], long Gy[3][3]) { //neu khong co du lieu anh if(!image->GetDIB()) return false; // Gradient Algorithm long sum; long sumx,sumy;//gia tri tinh gx, gy long x,y; //long r,g,b; long i,j,gx,gy; //RGBQUAD c; //CxImage tmp; BYTE cindex; //tmp=image->cop CxImage tmp; tmp.Copy (*image); long xmin,xmax,ymin,ymax; xmin = ymin = 0; xmax =(long) image->GetWidth(); ymax=(long)image- >GetHeight(); //neu anh la 8bit/1pixel if ((image->GetBpp() ==8)||(image->GetBpp() ==4)) { for(y=ymin; y<ymax; y++) { for(x=xmin; x<xmax; x++) { sumx=0; sumy=0; sum=0; //kiem tra toa do x,y co nam trong anh hay khong if (image->SelectionIsInside(x,y)) { //xu ly cac toa do o duong vien anh if(y==0 || y == ymax-1) sum=0; else if(x==0 || x==xmax-1) sum=0; //tinh xap xi gradient else { Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên Trang 19 / 25 //tinh theo chieu x for( i=-1; i<=1 ; i++) for(j=-1; j<=1; j++) { //lay gia tri mau CString s1; cindex=image- >GetPixelIndex(x+i,y+j); gx=Gx[i+1][j+1]; sumx=sumx+ (cindex* gx); } //tinh theo chieu y for( i=-1; i<=1 ; i++) for(j=-1; j<=1; j++) { //lay gia tri mau cindex=image- >GetPixelIndex(x+i,y+j); gy=Gy[i+1][j+1]; sumy=sumy+ (cindex* gy); } //lay xap xi sum=abs(sumx)+abs(sumy); sum=(BYTE)min(255, sum); } //AfxMessageBox(sum); tmp.SetPixelIndex(x,y,255-(BYTE)sum); } } } } //chuyen doi anh image->Transfer(tmp); return true; } CxImage CDemo3Doc::LamManhBien(CxImage *img) { Tiểu luận môn xử lý ảnh - Biên và các phương pháp dò biên Trang 20 / 25 if(!img->GetDIB()) return false; long x,y; //CxImage tmp; //tmp.Copy (*img); long xmin,xmax,ymin,ymax; BYTE preindex,posindex,index; xmin = ymin = 0; xmax =(long) img->GetWidth(); ymax=(long)img->GetHeight(); //neu anh la 8bit/1pixel if ((image->GetBpp() ==8) || (image->GetBpp() ==4)) { for(y=ymin; y<ymax; y++) { for(x=xmin; x<xmax; x++) { preindex=img->GetPixelIndex(x-1,y-1) ; index=img->GetPixelIndex(x,y) ; posindex=img->GetPixelIndex(x+1,y+1) ; //neu index tai diem x,y khong lon hon tai diem x-1,y-1 va x+1,y+1 thi loai bo if ((index<=preindex || index<=posindex)) img->SetPixelColor( x,y,RGB(0,0,0)); //dat mau den } } } return *img; } void CDemo3Doc::OnMethodPrewitt() { // TODO: Add your command handler code here // TODO: Add your command handler code here if (image==0) return; if (!image->IsValid()) return; . m 12 m13 m21 m 22 m23 m31 m 32 m33 Ma trận ảnh ra sau khi nhân chập b11 b 12 b13 b1n b21 b 22 b23 b2n b31 b 32 b33 b3n Trong đó: b 22= (a11*m11)+ (a 12* m 12) + (a 12* m13)+ (a21*m21) + (a 22* m 22) . lý ảnh - Biên và các phương pháp dò biên Trang 16 / 25 2. 4.4. Chức năng dò biên gián tiếp(Indirect Method) Kết quả dò biên theo phương pháp này Tiểu luận môn xử lý ảnh - Biên và các. lý ảnh - Biên và các phương pháp dò biên Trang 11 / 25 Để dễ hiểu, phần dưới đây sẽ minh hoạ thêm về giải thuật này: Ma trận ảnh vào Mặt nạ a11 a 12 a13 a1n a21 a 22 a23 a2n a31 a32