Tìm hiểu và khảo sát ứng dụng của kỹ thuật làm mảnh đối tượng ảnh nhị phân
1 Bài tập lớn xử lý ảnh ( Nhóm tin 2-K49 : Hoàng Tuấn Khánh & Hoàng Thanh Tùng ) Giới thiệu qua đề tài Phần I : Kiến thức cơ bản Phần II : Áp dụng một số thuật toán Phần III : Ứng dụng trong hệ thống nhận dạng mẫu Giới thiệu qua đề tài Đề tài Đề 23: Tìm hiểu và khảo sát ứng dụng của kỹ thuật làm mảnh đối tượng ảnh nhị phân Giáo viên hướng dẫn: Nguyễn Thị Hoàng Lan Nhóm sinh viên thực hiện : Hoàng Tuấn Khánh Hoàng Thanh Tùng Lời nói đầu Xử lý ảnh là một môn học có rất nhiều ứng dụng trong thực tế. Để có thể vận dụng các kiến thức được học trên lớp, chúng em phải hoàn thành một project nhất định. Chúng em đã chọn đề tài "Tìm hiểu và khảo sát ứng dụng của kỹ thuật làm mảnh đối tượng ảnh nhị phân" vì thấy đây là một đề tài rất hay, đặc biệt có liên quan đến vấn đề phục hồi và nhận dạng, một kỹ thuật rất được quan tâm bây giờ. Chính nhờ quá trình nỗ lực làm bài tập lớn, chúng em đã xây dựng được những mô đun và tích luỹ được những kinh nghiệm hết sức quý báu. Và vì vậy nên do nhận thấy sự liên quan, hỗ trợ lẫn nhau giữa các đề tài nên chúng em xin được phát triển thêm một số tính năng của chương trình bằng cách tìm hiểu và giải quyết thêm một số đề tài khác. Nhờ vậy mà khả năng làm việc theo nhóm của chúng em đã tiến bộ rõ rệt. Do thời gian gấp rút vì sắp đến thời kỳ ôn thi, và cũng chưa có được kinh nghiệm cũng như tài liệu đầy đủ, nên chúng em chưa thể hoàn thành mục đích đề ra, tuy nhiên cũng đã thu được rất nhiều thắng lợi ban đầu. Chúng em xin cám ơn cô đã tận tình hướng dẫn và dành thời gian đọc bản báo cáo này. Qua việc làm bài tập lớn, chúng em cảm thấy yêu môn học này hơn và quyết định sẽ đi sâu tìm hiểu về lĩnh vực này một ngày không xa, khi có điều kiện. Hà Nội, ngày 15 tháng 4 năm 2008 2 Nhóm sinh viên Hoàng Tuấn Khánh Hoàng Thanh Tùng Phân công công việc: Vì mục đích là trau dồi kiến thức, chúng em luôn hỗ trợ và phân công công việc theo tiêu trí cả 2 cùng phát triển. Tức là em và bạn Tùng cùng tìm hiểu và cài đặt thuật toán bằng C, C++ hoặc Java, sau đó tìm hiểu thêm việc áp dụng vào thực tế qua kết quả của chương trình. Nhưng nếu phân công chi tiết thì: Hoàng Tuấn Khánh: Tìm hiểu kỹ thuật làm mảnh ảnh nhị phân, phân tích và tìm hiểu giải thuật làm mảnh Lu-Wang được phát triển từ thuật toán Zhang-Suen, ứng dụng của kỹ thuật làm mảnh. Hoàng Thanh Tùng: Tìm hiểu kỹ thuật làm mảnh ảnh nhị phân, giải thuật làm mảnh song song bằng giải thuật Lu-Wang. Cụ thể hoá bằng chương trình. Ngoài ra chúng em còn tìm hiểu thêm một số vấn đề khác được nêu trong bài viết này. Cụ thể hoá chương trình: Chương trình cuối cùng được quyết định viết bằng Java, giao diện đơn giản dễ dùng, và đã chạy thành công một số giải thuật cốt yếu. Chương trình có các tính năng như dò biên, làm mảnh ảnh nhị phân, biểu đồ histogram, biến đổi ảnh màu và xám, biến đổi furier và cosin rời rạc, ngoài ra đang phát triển thêm bộ công cụ cho phép vẽ và thao tác trực tiếp lên ảnh nhờ các phép toán vị trí trên ma trận, nhưng hiện tại chúng em chưa có thời gian để thực hiện. Chúng em xin giới thiệu qua giao diện của chương trình : 3 Kiến thức cơ bản Xử lý ảnh là môn khoa học còn mới mẻ nhưng ứng dụng khá nhiều trong thực tế, đặc biệt là hệ thống nhận dạng. Một hệ thống xử lý ảnh cơ bản thực hiện việc thu nhận ảnh + phân tích ảnh + trích chọn đặc tính + lưu trữ để phục vụ cho các mục đích khác nhau. Vì ảnh trong tự nhiên có lượng thông tin rất lớn, do đó ta phải biết lưu trữ sao cho tốn ít dung lượng mà vẫn đảm bảo ảnh lưu trữ được những đặc tính cơ bản nhất. Muốn đọc được ảnh, trước tiên đòi hỏi bạn phải có kiến thức căn bản về C, và cách tổ chức file. Bạn cần phải biết đọc các header để biết dạng ảnh, đọc các pixel ảnh và chuyển đổi chúng thành dữ liệu thích hợp để thực hiện việc xử lý. Chẳng hạn việc đọc ảnh màu bạn phải biết đổi màu ra mức xám và sau khi thực hiện xử lý bạn đổi ngược lại, điều này cần một sự phân ngưỡng chẳng hạn như ma trận dither. Hay việc phóng to thu nhỏ ảnh chỉ đơn thuần là ta chèn thêm hàng và cột hoặc bỏ đi theo cách nội suy, vì thế khi phóng to hết cỡ ảnh bạn thấy những ô vuông có duy nhất một mầu, là vì các điểm ảnh giống nhau tập hợp lại do phép chèn. Ví dụ một ảnh : 1 2 3 4 5 6 7 8 9 phóng to thành 1 1 2 2 3 3 1 1 2 2 3 3 4 4 5 5 6 6 4 4 5 5 6 6 7 7 8 8 9 9 7 7 8 8 9 9 Để có thể hiểu được bài viết này đòi hỏi bạn phải có một kiến thức cơ bản về xử lý ảnh trong môn học này, nếu biết thêm về đồ hoạ thì càng tốt. Phần đầu tiên này sẽ giới thiệu qua về các kiến thức cơ bản nhất, vì thời gian có hạn nên chỉ mang tính giới thiệu, bạn xem lại sách để biết thêm. Biến đổi ảnh Đó là cách đưa ảnh từ miền A sang miền B, sao cho có thể đưa ngược lại từ B sang A, đưa ngược lại là khôi phục ảnh. Các biến đổi hay dùng đó là biến đổi furier chuyển sang miền tần số hoặc là kl làm giảm không gian nhờ trích chọn đặc tính qua việc làm cực tiểu bình phương (giảm thứ nguyên). Thông thường, để đơn giản ta chỉ cần hiểu 2 ảnh là u và v, phép biến đổi là A thì : u = A*t v A* v= A u At với At là ma trận chuyển vị, còn A* là ma trận đổi dấu phần phức của A 4 Trích chọn đặc tính Lấy biên hoặc vùng ảnh phục vụ cho các mục đích nhận dạng, trước khi trích chọn đặc tính cần cải thiện ảnh, đó là các phép xử lý như lọc, tăng độ tương phản Lưu trữ Ảnh được lưu trữ dưới các mảng, khi hiển thị thì dùng thuật toán cắt tỉa để hiện vùng ảnh xuất hiện, giải thuật cohen dùng 4 bít từ phải sang trái để mã hoá cho vị trí trái phải dưới trên. Để giảm dung lượng thường dùng cách lưu trữ dưới dạng nén, chẳng hạn định dạng gif cho việc mã hoá khối lượng màu lớn, jpeg cho đồ hoạ kỹ xảo, và nén không mất thông tin như huffman Áp dụng một số thuật toán Biến đổi từ ảnh đa mức xám sang ảnh màu Biến đổi Cosin rời rạc Biểu đồ xám Histogram và co giãn biểu đồ làm tăng độ tương phản ảnh: Phép lọc số để cải thiện ảnh Phát hiện và tách biên Ứng dụng của việc phát hiện biên ảnh Kỹ thuật lọc Wiener Làm mảnh biên cho ảnh nhị phân Nhận dạng ảnh Nén ảnh Trước tiên giả sử đã xây dựng được các lớp thao tác vào ra cho chương trình như đọc file ảnh, dựa vào phần header cùng bảng giải mã kèm theo để lấy nội dung ảnh, các phương thức vẽ ảnh , vì mục đích là để nêu cách giải quyết vấn đề, mô phỏng thuật toán nên chúng em không nêu các lớp phụ này, tập trung để giới thiệu những lớp chính. Biến đổi từ ảnh đa mức xám sang ảnh màu 5 Kỹ thuật này còn gọi là kỹ thuật LUT (look up table) Để hiện một ảnh màu từ ảnh đa mức xám bạn phải có một ngưỡng quy ước trong bảng nào đó, ví dụ với ảnh 2 màu bạn có thể dùng ngưỡng như sau: nếu mức xám lớn hơn 127 cho hiện thành màu trắng, nếu nhỏ hơn thì hiện màu đen Nếu bạn muốn có 4 màu thì làm như sau : chia làm 4 ngưỡng 0-64-128-192-255 ta có các màu trong bảng tra như sau: ngưỡng mức xám màu 1 đen đen 2 xám đậm đỏ 3 xám nhạt xanh 4 trắng vàng Muốn có nhiều màu hơn bạn phải phân chi tiết hơn. Để hiểu thêm về màu bạn hãy nghiên cứu phần bù và tính bão hoà. Chẳng hạn phần bù của RGB là CYM, cho thêm màu trắng vào một màu nào đó thì nó sẽ nhanh chóng bão hoà Còn nếu muốn biến ảnh màu thành ảnh đa mức xám để phục vụ cho việc xử lý ảnh bạn làm như sau: một màu 32 bit chia làm 8 cụm hexa, bạn dùng các mặt nạ và phép dịch bit để tính giá trị 2 cụm một tương ứng với các màu, sau đó lấy giá trị trung bình chuyển sang mức xám. Lớp này có thể thực hiện như sau: //lấy màu đỏ từ pixel public class RGB { public static int getRed(int pix){ return (pix&0x00ff0000)>>16; } //lấy màu lục từ pixel public static int getGreen(int pix){ return (pix&0x0000ff00)>>8; } //lấy màu lam từ pixel public static int getBlue(int pix){ return pix&0x000000ff; } //tính trung bình public static int getColorAverage(int pixel) { int red = pixel & 0x00ff0000; int green = pixel & 0x0000ff00; int blue = pixel & 0x000000ff; return ((red >> 16) + (green >> 8) + blue) / 3; } 6 //lấy cả 3 màu public static int[] getColorRGB(int pixel[]) { int red; int green; for (int i=0;i<pixel.length;i++){ pixel[i]=pixel[i]&0x000000ff; red=pixel[i]; green=pixel[i]; pixel[i]=pixel[i]|(red<<16)|(green<<8)|0xff000000; } return pixel; } } Biến đổi Cosin rời rạc Mục đích của biến đổi là ta chuyển sang một không gian trực giao khác, và ảnh có thể được biểu diễn qua các ảnh cơ sở của không gian này, giống như là các vector đơn vị biểu diễn một vector trong hệ trục toạ độ trực giao. Việc tính nhanh biến đổi thực chất là tính biến đổi kích cỡ n bằng một biến đổi kích cỡ 2n do tính đối xứng của nó. Chẳng hạn như cách tìm ma trận biến đổi furier unitar trong sách đã dậy, đây là một lớp cho phép bạn nén ảnh nhờ biến đổi Cosin rời rạc: //lớp DCT decrete cosin transform public class CompressDCT extends Component { public CompressDCT(){ int [][]F=new int [DrawImage.width][DrawImage.height]; //DrawImage là đối tượng ma trận ảnh for (int i=0;i<DrawImage.height;i++){ for (int k=0;k<DrawImage.width;k++){ F[k][i]=RGB.getColorAverage(DrawImage.pixels[i*DrawImage.width+k]); } } F=compute(F); //phương thức tính ra biến đổi for (int i=0;i<DrawImage.height;i++){ for (int k=0;k<DrawImage.width;k++){ DrawImage.pixels[i*DrawImage.width+k]=F[k][i]; } } ProcessImageView.image=createImage (new MemoryImageSource(DrawImage.width,DrawImage.height,DrawImage.pixels,0,D rawImage.width)); } public int[][] compute(int f[][]){ 7 double pi=Math.PI; double Cu=0; double Cv=0; int Nx=DrawImage.width; int Ny=DrawImage.height; int [][]F=new int[Nx][Ny]; double tg = 0; for (int u=0;u<Nx;u++){ for (int v=0;v<Ny;v++){ for (int x=0;x<Nx;x++){ for (int y=0;y<Ny;y++) { tg= tg + f[x][y]*Math.cos((2*x+1)*u*pi/2/Nx) * Math.cos((2*y+1)*v*pi/2/Ny); } } if (u==0)Cu=1/Math.sqrt(Nx); else Cu=1; if (v==0)Cv=1/Math.sqrt(Ny); else Cv=1; F[u][v]=(int)(4/(Nx+Ny)*Cu*Cv*tg); System.out.println(F[u][v]); } } return F; } public int[] formular(int [] x){ int N=x.length; float [] X=new float[N]; float tg=0; for (int k=0;k<N;k++){ for (int n=0;n<N;n++){ if (k==0) tg=(float) (tg +1/Math.sqrt(2)* x[n] * Math.cos((2 * n + 1) / (2 * N))); else tg=(float) (tg + x[n] * Math.cos((2 * n + 1) / (2 * N))); } X[k]=(float) (Math.sqrt(2 / N) * tg); } tg=0; for (int n=0;n<N;n++ ){ for (int k=0;k<N;k++){ if (k==0) tg=(float) (tg +1/Math.sqrt(2)* X[k] * Math.cos((2*n+1)/2/N)); else tg=(float) (tg + X[k] * Math.cos((2*n+1)/2/N)); } x[n]=(int) (Math.sqrt(2 / N) + tg); } return x; } } Biểu đồ xám Histogram và co giãn biểu đồ làm tăng độ tương phản ảnh: 8 Việc tính ra biểu đồ histogram thực chất là tính tần xuất xuất hiện các điểm có mức xám từ 0 đến một ngưỡng nào đó, tối đa là 255. Lớp tính Histogram như sau: public class Histogram extends JPanel { float [] pix; float scale; float max=0; Label lab; public Histogram(float [] pix,Label lab){ //contructor this.lab=lab; setBackground(Color.white); this.pix=pix; for (int i=0 ;i<256;i++){ if (max<pix[i])max=pix[i]; } scale=100/max; paintImmediately(0,0,150,260); addMouseMotionListener(new MouseMoved()); } public float getMax(){ return max; } //phương thức để vẽ ra public void paintComponent(Graphics g){ g.drawLine(19,40+(int)(max*scale),19,40); Graphics2D g2D=(Graphics2D) g; g2D.setPaint(Color.red); for (int i=0;i<256;i++){ g2D.drawLine(20+i,40+(int)(max*scale),20+i,40+(int)(max*scale- pix[i]*scale)); if (pix[i]!=0) System.out.println("i="+i+" "+pix[i]); } } // sự kiện khi di chuột 9 class MouseMoved extends java.awt.event.MouseMotionAdapter{ public void mouseMoved(MouseEvent event){ if (event.getX()>19 && event.getX()<256+20){ lab.setText("Point:"+(event.getX()-20)+" Value:"+pix[event.getX()-20]); } } } bạn muốn hiệu ứng xảy ra khi co giãn biểu đồ thì có thể dùng một thanh slider để gán sự kiện cho nó Lớp co giãn biểu đồ xám public class ExpandHistogram { public int[] transform(int [] pixel,float lmax,float lmin){ int max=0; int min=255; for (int i=0 ;i<pixel.length;i++){ pixel[i]=RGB.getColorAverage(pixel[i]); if (pixel[i]>max)max=pixel[i]; if (pixel[i]<min)min=pixel[i]; } float tg=(lmax-lmin)/(max-min); float tg1=(lmin*max-lmax*min)/(max-min); for (int i=0 ;i<pixel.length;i++){ pixel[i]=(int)(tg*pixel[i]+tg1); } pixel=RGB.getColorRGB(pixel); return pixel; } } Phép lọc số để cải thiện ảnh Một bức ảnh được lọc thông thấp : 10 Phương pháp lọc rất đơn giản, đó là bạn xếp chồng ma trận lọc vào ảnh, chỉ xếp trồng trung tâm, các ma trận lọc có thể là thông cao, thông thấp, hoặc trung vị. Giả sử ma trận lọc là h nhận được từ việc đọc một file ngoài txt. short result[][]=new short [DrawImage.height][DrawImage.width]; short min=Short.MAX_VALUE; short max=Short.MIN_VALUE; int size=Convolution.size; for (int i=1;i<DrawImage.height-1;i++){ for (int j=1;j<DrawImage.width-1;j++){ result[i][j]=0; for(int I=-size; I<=size; I++) for(int J=-size; J<=size; J++) result[i][j]+=(short)((F[i+I][j+J]*h[I+1][J+1])); result[i][j]=(short)(result[i][j]/fact); if (result[i][j]<min) min=result[i][j]; if (result[i][j]>max) max=result[i][j]; } } if (min<0) { if (max-min<256){//khi gia tri chua vuot khoang 255 for (int i=1;i<DrawImage.height-1;i++){ for (int k=1;k<DrawImage.width-1;k++){ DrawImage.pixels[i*DrawImage.width+k]=result[i][k] - min; } } }else {//ca max va min khong chap nhan duoc short tg=(short) (max - min); for (int i=1;i<DrawImage.height-1;i++){ for (int k=1;k<DrawImage.width-1;k++){ [...]... ********************************************************* Ảnh gốc : 11 Ảnh tách biên theo phương pháp Sobel: Ảnh tách biên theo phương pháp Laplacian: Đặc tính biên ảnh là một vấn đề cơ bản và rất quan trọng trong vấn đề xử lý ảnh Cạnh của ảnh là những vùng ảnh với độ tương phản rất rõ - một đột biến về cường độ sáng từ điểm ảnh này đến điểm ảnh khác Dò biên ảnh có một ý nghĩa quan trọng trong việc làm giảm số lượng dữ liệu và lọc đi những... tính toán một bức ảnh Điển hình là nó sử dụng một 13 giá trị tuyệt đối xấp xỉ cho mỗi điểm ảnh từ một bức ảnh đa mức xám đầu vào Phương pháp dò sử dụng một mặt nạ tích chập kích thước 3x3, một cái là tính theo hướng x và một cái tính theo hướng y Mặt nạ trượt trên ma trận ảnh và tính ra giá trị tương ứng mỗi điểm trung tâm Mặt nạ Sobel cho dưới đây: Công thức tính gradient là : Và độ lớn của gradient có... dựa vào góc này để biết hướng của gradien, từ đó với mỗi điểm trên biên sẽ được hiện khi 2 điểm lân cận theo hướng đạo hàm của nó đều nhỏ hơn nó Phương pháp dò biên canny sử dụng một ma trận nhân chập của laplace với ma trận gauss để khử ảnh hưởng của nhiễu Các phương pháp lọc tối ưu thực hiện theo 3 tiêu chí để làm giảm số điểm cực đại cục bộ để làm mảnh biên, làm giảm nhiễu-tỉ số giữa tín hiệu và. .. bức ảnh gốc Chúng ta hoàn thành việc này bằng cách sử dụng một giải thuật dò Laplacian, các bước thực hiện như sau: Bước 1: Chúng ta hãy thử bắt đầu với bức ảnh người đàn ông đẹp trai này: Vì bức ảnh trong hoạt hình nó chịu các ảnh hưởng của tốc độ, nên các điểm ảnh biến 28 thiên theo thời gian và thực tế là ta chỉ có bức ảnh thứ 2 bên phải chứ không phải bức ảnh đầu tiên bên trái Bước 2: Làm mờ bức ảnh. .. Bức ảnh bên trái là một nghịch bản của bức ảnh bên phải, trong đó vùng đen tương ứng với điểm 0 Bức ảnh bên phải là một bức ảnh nhị phân nhờ việc tìm các điểm 0 qua phép tính Laplacian Chúng ta đã tìm ra cạnh, nhưng cũng nhận được cả những gợn ảnh nhỏ khác không cần thiết Để xoá bỏ những gợn ảnh này, chúng ta thực hiện một bước tiếp theo Khi chúng ta tìm ra một điểm 0 của phép tính Laplacian, chúng ta... là mật độ quang phổ của ảnh nguyên mẫu và ♂n(u,v) là mật độ năng lượng quang phổ của nhiễu, nó là một biến đổi furier của tín hiệu tương quang, công thức: Mật độ năng lượng quang phổ của ảnh mờ có thể được tính như sau: Vì vậy công thức cho bộ lọc Wiener là F(u,v) = G(u,v) R(u,v) với : Khi đó, từ ảnh mờ ta lọc với bộ lọc Wiener sẽ thu được ảnh gần với ảnh gốc và ít bị ảnh hưởng của nhiễu Do đó các... cực đại, thì mức độ của nó trong bức ảnh dẫn xuất là cực tiểu Và kết quả là, việc tìm ra cạnh của ảnh tức là định vị những điểm có cường độ là 0 trong bức ảnh thứ 2 được dẫn xuất Phương pháp này gọi là Laplacian và tín hiệu của nó có dạng : Sobel : Dựa vào lý thuyết đạo hàm một chiều, lý thuyết này có thể được mở rộng ra cho 2 chiều, cũng như việc tính xấp xỉ nó áp dụng cho một bức ảnh 2 chiều Toán tử... cạnh Ích lợi của việc này rất rõ ràng, bạn hãy xem bức ảnh sau đây: Và như vậy, chúng ta đã có được những đặc trưng cơ bản để làm hoạt hình, với một công cụ đồ hoạ nào đó thích hợp Kỹ thuật lọc Wiener Ví dụ về một bức ảnh bị nhiễu và đã được lọc nhờ ma trận lọc Wiener kích thước 5x5 Ảnh sau khi qua một đáp ứng nào đó thì bị nhiễu và khác với ban đầu, theo lý thuyết ta xây dựng một đáp ứng ngược lại... khôi phục ảnh dựa vào đáp ứng ban đầu Tuy nhiên đáp ứng xung là vô hạn và điều này nghĩa là không thể xây dựng được nó bằng một ma 31 trận lọc Một cách khác là sử dụng đáp ứng xung hữu hạn FIR Các phương pháp lọc ngược và lọc giả ngược đã không khắc phục được nhiễu, do đó phương pháp lọc Wiener đã giải quyết vấn đề này Lọc wiener mục đích để làm cực tiểu bình phương sai khác giữa ảnh gốc và ảnh đang... quan trọng của bức ảnh Có nhiều cách để thực hiện vấn đề này Tuy nhiên các phương pháp khác nhau có thể nhóm vào 2 mục chính, gradient và Laplacian Phương pháp dò biên theo gradient thực hiện bằng cách dò tìm điểm cực đại và cực tiểu từ bức ảnh nguồn Phương pháp Laplacian tìm kiếm các điểm 0 thông qua bức ảnh thứ 2 biến đổi từ ảnh gốc để tìm ra cạnh Một cạnh là đường một chiều dạng bờ dốc và tính toán . hiểu giải thuật làm mảnh Lu-Wang được phát triển từ thuật toán Zhang-Suen, ứng dụng của kỹ thuật làm mảnh. Hoàng Thanh Tùng: Tìm hiểu kỹ thuật làm mảnh ảnh nhị phân, giải thuật làm mảnh song. sau đó tìm hiểu thêm việc áp dụng vào thực tế qua kết quả của chương trình. Nhưng nếu phân công chi tiết thì: Hoàng Tuấn Khánh: Tìm hiểu kỹ thuật làm mảnh ảnh nhị phân, phân tích và tìm hiểu. " ;Tìm hiểu và khảo sát ứng dụng của kỹ thuật làm mảnh đối tượng ảnh nhị phân& quot; vì thấy đây là một đề tài rất hay, đặc biệt có liên quan đến vấn đề phục hồi và nhận dạng, một kỹ thuật rất