View Single Post
Old 17-01-2009, 09:47 PM   #13
mrlong
Nhập môn đệ tử
 
Tham gia ngày: Aug 2008
Bài gửi: 1
:
Chào các bạn. Tôi là SV TDH BKHN. Tôi cũng đang làm một đề tài điều khiển robot ứng dụng công nghệ xử lý ảnh. Cũng chưa phải là cao thủ gì về XLA cả, chỉ là có chút kiến thức muốn chia sẻ. Dưới đây là báo cáo đầu tiên của tôi cho thầy hướng dẫn. Bản báo cáo này khá sơ khai tuy nhiên lại chứa đựng rất nhiều kiến thức quan trọng cho các bạn mới nhập môn. Các bạn nên dowload file đính kèm để xem bài viết có đủ ảnh minh họa.


Báo cáo kết quả nghiên cứu xử lý ảnh

Phần 1: Tổng quan về xử lý ảnh
Phần 2: Thư viện xử lý ảnh OpenCV
Phần 3: Một số chương trình xử lý ảnh

Phần 1: Tổng quan về xử lý ảnh
I. Các khái niệm chung về xử lý ảnh
1. Định nghĩa
- Xử lý ảnh là quá trình chụp ảnh, phân tích nhận dạng ảnh và đưa ra các tín hiệu điều khiển hợp lý.
2. Một số khái niệm liên quan
- Pixel: phần tử ảnh. Đó là các điểm nhỏ cấu thành nên ảnh, xuất hiện khi ta tiến hành số hoá ảnh.
- Mức xám: là kết quả mã hoá cường độ sáng của một điểm ảnh với một giá trị số. Mã hoá 256 là phổ dụng nhất vì mỗi pixel ảnh sẽ được mã hoá bằng 8 bit.
II. Các bước trong quá trình xử lý ảnh















1. Chụp ảnh
- Kết nối Camera với máy tính. Camera được sử dụng ở đây là Webcam Logitech.
- Sử dụng một hàm trong thư viện OpenCV để thực hiện công việc chụp ảnh
- Sau khi chụp ảnh xong ta cũng sử dụng một hàm trong OpenCV để lưu ảnh
2. Tiền xử lý dữ liệu ảnh
Quá trình tiền xử lý dữ liệu ảnh bao gồm hai công việc sau:
+ Phối cảnh cho ảnh
+ Chuyển về ảnh xám và xác định lược đồ xám
a. Phối cảnh cho ảnh
- Ảnh sau khi chụp sẽ có một góc nghiêng nhất định so với mặt phẳng do đó cần phải thực hiện một công việc phối cảnh cho ảnh nhằm “xoay” và “kéo” ảnh thành ảnh trong mặt phẳng 2D. Việc này sẽ làm cho tỷ lệ, kích thước của ảnh giống như trong thực tế.
b. Chuyển về ảnh xám và xác định lược đồ xám
- Với ảnh màu thu được ta không thể tiến hành nhận dạng được ngay mà trước hết cần phải chuyển ảnh đã cho về ảnh xám
- Mỗi một phần tử ảnh có một cường độ sáng nhất định, cường độ sáng này được số hoá thành các mức xám và dựa vào các mức xám này ta sẽ chuyển ảnh thành ảnh xám.
- Lược đồ xám là lược đồ cung cấp thông tin về phân bố mức xám của ảnh, xác định xem ảnh là sáng hay tối.
3. Nhị phân ảnh
- Ảnh nhị phân là ảnh mà giá trị của các điểm ảnh chỉ có hai giá trị là 0 và 1 (trắng và đen)
- Để chuyển từ ảnh xám về ảnh nhị phân ta đặt một ngưỡng thích hợp để so sánh. Mức xám của ảnh sẽ được dùng để so sánh với giá trị ngưỡng này.
Biểu thức:
0 nếu u < T
f(u) =
1 nếu u  T

- Việc chọn ngưỡng là rất quan trọng, nếu chọn ngưỡng hợp lý thì ta có thể phân biệt được vật thể với nền và ngược lại.
4. Phân vùng ảnh
Sau khi thực hiện nhị phân ảnh, ta thu được một ảnh gồm hai màu đen và trắng. Giá trị của các điểm ảnh chỉ là 0 và 1. Bước tiếp theo ta cần thực hiện công việc phân vùng ảnh nhằm phân biệt vật thể với nền và ngược lại.
Thuật toán phân vùng ảnh dựa trên kỹ thuật đánh nhãn liên tiếp.
Với kỹ thuật đánh nhãn liên tiếp ta có thể sử dụng ma trận mặt nạ 3x3 để quét lần lượt tất cả các điểm ảnh. Có 2 kỹ thuật có thể sử dụng ở đây:
- Mặt nạ ảnh với 4 điểm lân cận
- Mặt nạ ảnh với 8 điểm lân cận








Mặt nạ với bốn điểm lân cận và tám điểm lân cận
Quy ước khi quét ảnh:
- Nếu điểm ảnh có giá trị là 0 thì gọi là điểm ảnh nền
- Nếu điểm ảnh có giá trị là 1 thì gọi là điểm ảnh nổi
Ta chỉ đánh nhãn các điểm ảnh nổi
Quá trình đánh nhãn ảnh được thực hiện theo các bước sau:
Bước 1: Tiến hành quét lần lượt tất cả các điểm ảnh từ trái sang phải, từ trên xuống dưới. Nếu gặp điểm ảnh nền thì bỏ qua, nếu gặp điểm ảnh nổi thì tiến hành đánh nhãn. Trước khi đánh nhãn cho mỗi điểm ảnh nổi, ta cần quan tâm đến giá trị của điểm ảnh phía trên và điểm ảnh bên trái của điểm ảnh ta đang xét. Nếu các điểm ảnh này đã được đánh nhãn thì điểm ảnh đang xét được đánh nhãn trùng với điểm ảnh trên hoặc điểm ảnh bên trái đó. Nếu các điểm ảnh bên trên và điểm ảnh bên trái là các điểm ảnh nền thì ta đánh nhãn mới cho điểm ảnh đang xét.
Bước 2: Sau khi đánh nhãn tất cả các điểm ảnh nổi, ta cần nhóm các điểm ảnh ở gần nhau nhưng lại được đánh nhãn khác nhau lại với nhau.
Bước 3: Thực hiện quét lại và đánh nhãn mới cho các nhóm điểm ảnh vừa được nhóm lại ở trên.
5. Nhận dạng mục tiêu

Là quá trình xác định chính xác vật thể cần nhận dạng. Phương pháp được sử dụng ở đây là nhận dạng dựa vào đường biên vật thể. Từ biên dạng này ta sẽ xác định được các đỉnh, các cạnh và cả tâm của vật thể. Phương pháp phổ biến hiện nay là phương pháp Cany.
Nội dung phương pháp Cany như sau:
Bước 1: Làm trơn ảnh bằng bộ lọc Gauss để loại bỏ ảnh hưởng của nhiễu
Bước 2: Tính gradient của các phần tử ảnh và hướng của gradient
i

Xác định ngưỡng:

6. Xác định tâm vật thể
Sau khi đã nhận dạng được vật thể trong không gian làm việc, ta có thể kẻ các đường bao quanh vật và dễ dàng xác định được tâm của vật thể.




Phần 2. Thư viện xử lý ảnh OpenCV
I. Giới thiệu chung về thư viện OpenCV
OpenCV (Intel® Open Source Computer Vision Library) là một thư viện mã nguồn mở của Intel viết cho xử lý ảnh. Đó là sự kết hợp các hàm của C với một vài lớp của C++ để thực hiện nhiều thuật toán xử lý ảnh rất phổ biến. Với khoảng trên 300 hàm C và một vài lớp C++ được viết riêng cho xử lý ảnh, OpenCV thực sự là một công cụ mạnh mẽ để thực hiện quá trình xử lý ảnh.
II. Cài đặt OpenCV trong Window
Quá trình cài đặt OpenCV bao gồm các bước sau:
- Tải phần mềm OpenCV trên trang Web của Intel
- Nháy đúp vào biểu tượng Setup OpenCV_1.0
Màn hình Setup hiện lên như sau:

Nhấn vào nút Next
- Cửa sổ tiếp theo hiện lên:

Chọn I accept the agreement
- Tiếp tục nhấn nút Next một vài lần nữa cho đến cửa sổ sau:

Chọn Install để tiến hành cài đặt
- Quá trình cài đặt bắt đầu:

- Sau một thời gian, quá trình cài đặt thực hiện xong. Kích vào nút Finish để hoàn tất quá trình cài đặt.


III. Liên kết OpenCV vào Visual C ++
Sau khi cài đặt xong OpenCV vào máy, để có thể viết được các chương trình xử lý ảnh sử dụng các hàm trong thư viện Open CV ta phải tiến hành liên kết nó với Visual Studio 6.0.
Các bước thực hiện quá trình liên kết như sau:
- Khởi động chương trình Visual Studio 6.0
- Vào menu Tools >> Options >> Chọn thẻ Directories >>
Tại ô Show directories for, ta chọn Include files:
Tại ô Directories, ta nhấn vào ô hình chữ nhật có nét đứt và Browse đến các thư mục sau:
C:\PROGRAM FILES\OPENCV\CV\INCLUDE
C:\PROGRAM FILES\OPENCV\OTHERLIBS\HIGHGUI
C:\PROGRAM FILES\OPENCV\CXCORE\INCLUDE
C:\PROGRAM FILES\OPENCV\OTHERLIBS\CVCAM\INCLUDE
để add các Include files đó vào Visual Studio 6.0

Tiếp theo, tại ô Show Directories ta chọn Library files và add thư viện sao vào Visual Studio 6.0
C:\PROGRAM FILES\OPENCV\LIB


Sau đó nhấn OK
Bước tiếp theo, ta vào menu Project >> Settings
Tại cửa sổ Project Settings ta chọn thẻ Link
Tại ô Object/library modules, ta thêm các thư viện sau:
cv.lib
highgui.lib
cxcore.lib
strmbase.lib



Sau đó nhấn OK để kết thúc quá trình nhúng OpenCV vào Visual Studio 6.0

Chú ý: Sau khi viết xong một chương trình xử lý ảnh ta cần copy tất cả các file trong thư mục C:\Program Files\OpenCV\bin vào thư mục chứa chương trình để đảm bảo có đủ các file thư viện động cho chương trình chạy hoàn hảo.

Phần 3. Một số chương trình xử lý ảnh đầu tiên

1. Chương trình chụp và lưu ảnh

#include "stdio.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"

int main (void)
{
CvCapture* capture = cvCaptureFromCAM (CV_CAP_ANY);
cvNamedWindow( "Pic 1", CV_WINDOW_AUTOSIZE);

IplImage *frame = cvQueryFrame (capture);
cvShowImage ("Pic 1", frame);
cvSaveImage("Picture.jpg",frame);
cvWaitKey(100);

cvReleaseCapture (&capture);
cvDestroyWindow ("Pic 1");
return 0;
}

2. Chương trình xác định phân bố mức xám của ảnh

include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char** argv )
{
int index = 0;
int bin_w,i;
float max_value = 0;
float range_0[]={0,256};
float* ranges[] = { range_0 };

IplImage *dst_image = 0, *hist_image = 0;
IplImage* src = 0;IplImage* src1 = 0;
CvHistogram *hist;
CvMat* lut_mat;

int hist_size = 256;
uchar lut[256];
CvCapture* capture = 0;
capture = cvCreateCameraCapture( index );
src1 = cvQueryFrame( capture );
cvSaveImage( "Long.jpg" ,src1 );

char file_name[] = "Long.jpg";
src = cvLoadImage( file_name, CV_LOAD_IMAGE_GRAYSCALE);
dst_image = cvCloneImage(src);
hist_image = cvCreateImage(cvSize(320,200), 8, 1);
hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
lut_mat = cvCreateMatHeader( 1, 256, CV_8UC1 );

for( i = 0; i < 256; i++ )
lut[i] = (uchar)i ;
cvSetData( lut_mat, lut, 0 );
cvLUT( src, dst_image, lut_mat );
cvCalcHist( &dst_image, hist, 0, 0 );
cvZero( dst_image );
cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 );
cvScale( hist->bins, hist->bins, ((double)hist_image->height)/max_value, 0 );
cvSet( hist_image, cvScalarAll(255), 0 );
bin_w = cvRound((double)hist_image->width/hist_size);

for( i = 0; i < hist_size; i++ )
cvRectangle( hist_image, cvPoint(i*bin_w, hist_image->height),
cvPoint((i+1)*bin_w, hist_image->height - cvRound (cvGetReal1D(hist->bins,i))),cvScalarAll(0), -1, 8, 0 );
cvNamedWindow( "Capture", 1 );
cvShowImage( "Capture", src1 );
cvNamedWindow("Image", 1);
cvShowImage( "Image", src );
cvNamedWindow("Histogram", 1);
cvShowImage( "Histogram", hist_image );
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&dst_image);
cvReleaseHist(&hist);

return 0;

}

3. Chương trình nhận dạng biên vật thể

#include "cv.h"
#include "highgui.h"
#include "stdio.h"

int main( int argc, char** argv )
{
IplImage* image; IplImage* src;
char* filename = argc == 2 ? argv[1] : (char*)"Long.jpg";
image = cvLoadImage( filename, 0);
src = cvCreateImage( cvGetSize(image), 8, 0 );
cvEqualizeHist( image , src);
// Phan vung anh
IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3 );
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contour = 0;

cvNamedWindow( "Source1", 1 );
cvShowImage( "Source1", src );
cvThreshold( src, src, 230, 255, CV_THRESH_BINARY );// xac dinh nguong
cvNamedWindow( "Source2", 1 );
cvShowImage( "Source2", src );
cvFindContours( src, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );
cvZero( dst );
int i = 0;
for( ; contour != 0; contour = contour->h_next )
{
i = i++ ;
printf("\n so %i %d.", i ,contour);
CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );
cvDrawContours( dst, contour, color, color, 1, 1, 8 );
}
cvNamedWindow( "Components", 1 );
cvShowImage( "Components", dst );
cvWaitKey(0);
cvReleaseImage(&dst);
cvReleaseImage(&src);
cvReleaseImage(&image);

cvDestroyWindow("Components");
cvDestroyWindow("Source1");
cvDestroyWindow("Source2");
return 0;
}
File Kèm Theo
File Type: rar Bao cao Nguyen Ba Long.rar (295.4 KB, 3017 lần tải)
mrlong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn