Lập trình xử lý ảnh cơ bản với thư viện OpenCV trên Linux Ubuntu
Bài viết sau đây giới thiệu về các thao tác xử lý ảnh cơ bản với thư viện OpenCV.
Chương trình minh họa Qt biên dịch chạy trên máy tính PC (Ubuntu) hoặc có thể được biên dịch để chạy trên ARM Linux
1. Giới thiệu về các thao tác xử lý ảnh cơ bản
Một số cách biểu diễn ảnh
Ø Ảnh màu (Color image)
ü Chứa thông tin màu của ảnh
ü Không gian màu thường sử dụng: RGB, CMYK
ü Ảnh RGB 3 kênh màu, mỗi kênh sử dụng 8 bit
Ø Ảnh đa mức xám (Grayscale image)
ü Ảnh đa mức xám là ảnh có sự chuyển dần mức xám từ trắng sang đen.
ü Sử dụng 8 bit để biểu diễn mức xám
Ø Ảnh nhị phân (Binary image)
Chuyển ảnh sang ảnh đa mức xám
Hàm chuyển ảnh màu sang ảnh đa mức xám:
Ø Bước 1: Tạo 1 ảnh trắng (chưa có dữ liệu) định dạng ảnh đa mức xám
IplImage *grayimage = cvCreateImage( cvSize( colorimg->width, colorimg->height ), IPL_DEPTH_8U, 1 );
Ø Bước 2: Chuyển đổi ảnh màu sang đa mức xám
cvCvtColor( img, grayimage, CV_RGB2GRAY );
Hình 1. Chuyển từ ảnh màu sang ảnh đa mức xám
Chuyển ảnh sang ảnh nhị phân
Phương pháp phân ngưỡng thích nghi:
Ø Sử dụng ngưỡng động cho các điểm ảnh khác nhau.
Ø Kỹ thuật này cho phép chúng ta có thể điều tiết, thích nghi với sự thay đổi về điều kiện sáng của ảnh ví dụ như ảnh có sử dụng các hiệu ứng rọi sáng (illumination) hay đổ bóng(shadow).
void cvAdaptiveThreshold(const CvArr* src, CvArr* dst, double maxValue, int adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C, int thresholdType = CV_THRESH_BINARY, int blockSize=3, doubleparam1=5)
– Src: ảnh ban đầu, dst: ảnh kết quả – maxValue: giá trị lớn nhất – adaptiveMethod: phương pháp tính ngưỡng thích nghi (CV_ADAPTIVE_THRESH_MEAN_C hay CV_ADAPTIVE_THRESH_GAUSSIAN_C)
Bộ lọc trung bình (Mean Filter)
Ý tưởng bộ lọc trung bình: thay thế giá trị tại mỗi pixel bằng trung bình các giá trị pixel trong mặt nạ lân cậnØ Loại bỏ những pixel biến đổi lớn so với lân cận (nhiễu) Ø Những pixel nằm trên biên cũng có sự biến đổi lớn so với lân cận à làm mờ
void cvSmooth(const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0, double param4=0)
Ø Src: ảnh gốc, dst: kết quả Ø Param1, param2, param3, param4: các tham số tùy thuộc vào bộ lọc Ø Param1 và param 2 quy định kích thước mặt nạ nhân chập
Hình 2. Lọc trung bình (Mean Filter)
Bộ lọc trung vị
Lọc trung vị cho kết quả tốt hơn và cho phép giữ lại nhiều chi tiết hữu ích trên ảnh hơn so với lọc trung bình. Để thực hiện lọc trung vị, chúng ta cũng dùng một cửa sổ như lọc trung bình nhưng thay vì đơn giản thay thế giá trị mức xám hiện tại với trung bình giá trị mức xám của các điểm lân cận bao bởi cửa sổ, chúng ta phải thực hiện các bước như sau:Ø Sắp xếp tất cả các giá trị mức xám trong phạm vi cửa sổ thành một chuỗi. Ø Thay thế giá trị mức xám của điểm đang xét với giá trị mức xám ở giữa. ØSử dụng hàm cvSmooth như trên với tham số smoothtype là CV_MEDIAN
Hình 3. Lọc trung vị (Median Filter) cho kết quả tốt hơn
Bộ lọc Gaussian
Sử dụng hàm cvSmooth với tham số smoothtype là CV_GAUSSIAN
Hình 4. Lọc Gaussian
Các phép xử lý hình thểØ Phép giãn vùng ảnh: Dilation
Hình 5. Phép giãn vùng ảnh (Dilation)
Ø Phép co vùng ảnh: Erosion
Hình 6. Phép co vùng ảnh (Erosion)
Ø Phép mở (thu nhỏ-phóng to): Opening (Thực hiện erosion trước, Dilation sau)
Tác dụng phép mở: Phép co giúp xóa các điểm nền không mong muốn à làm co toàn ảnh à dùng phép giãn để giãn lại ảnh.
Hình 7. Phép mở (Opening)
Ø Phép đóng (phóng to-thu nhỏ): Closing (Thực hiện Dilation trước, erosion sau)
Tác dụng phép đóng: Phép giãn có thể dùng để xóa các khe hở, khoảng trống ảnh hưởng toàn ảnh à dùng phép co để lấy lại cấu trúc ban đầu
Hình 8. Phép đóng (Closing)
Các phép dò biênØ Giới thiệu về dò biên:
ü Biên là các điểm mà ở đó có sự thay đổi lớn về giá trị màu/mức xám.
ü Dò biên sẽ giảm đáng kể lượng dữ liệu, lọc bỏ các thông tin không cần thiết trong khi vẫn giữ được các đặc tính quan trọng về cấu trúc của ảnh.
Ø Phân loại:
ü Phương pháp dựa trên gradient(đạo hàm cấp 1)
ü Phương pháp dựa trên Laplacian(đạo hàm cấp 2)
Dò biên bằng SobelHàm dò biên sobel: cvSobelØ Src: ảnh gốc Ø dst: kết quả Ø Xorder: cấp đạo hàm theo trục X Ø Yorder: cấp đạo hàm theo trục Y Ø apertureSize: kích thước mặt nạ nhân chập
Hình 9. Dò biên Sobel
Dò biên bằng CannyHàm dò biên sobel: cvCannyØ Src: ảnh gốc, edges: kết quả Ø Threshold1: ngưỡng 1 Ø Threshold2: ngưỡng 2 Ø apertureSize: kích thước mặt nạ nhân chập
Hình 10. Dò biên Canny
Cân bằng histogram
Ø Cân bằng histogram là một phương pháp thay đổi độ tương phản của ảnh bằng cách thay đổi lược đồ phân bố mức xám của chúng.
Ø Mục đích làm thay đổi biểu đồ phân bố mức xám từ phân bố ban đầu sang sự phân bố hướng tới đều.
Ø Tác dụng nhằm phát hiện những đối tượng bi che khuất trong ảnh ban đầu. Phép biến đổi này rất có ý nghĩa đối với những bức ảnh chụp trong bóng đêm, đối tượng thường bị mờ, hay bị che khuất bởi bóng tối, áp dụng cân bằng histogram có thể làm nổi rõ đối tượng hơn.
Ø Sử dụng hàm cvEqualizeHist
ü Src: ma trận ảnh gốc
ü Dst: ma trận ảnh sau khi đã cân bằng Histogram
Hình 11. Cân bằng Histogram
2. Chương trình Qt minh họa các thao tác xử lý ảnh cơ bản 2.1. Mô tả các chức năng chính của chương trình Xử lý ảnh: ü Open ảnh ü Save ảnh Các phép căn chỉnh ảnh: ü Lật ảnh (flip image). ü Quay ảnh (rotate image). ü Resize ảnh. ü Crop ảnh. ü Thay đổi độ sáng và độ tương phản. ü Xem histogram của ảnh.
Các phép biến đổi xử lý ảnh
ü Chuyển ảnh màu, đa mức xám sang ảnh nhị phân.ü Chuyển ảnh màu sang ảnh đa mức xám. ü Các biến đổi với bộ lọc:
· Blur.
· Gaussian.
· Median.
ü Các phép biến đổi hình thể:
· Phép co, giãn.
· Phép đóng, mở.
ü Các phép dò biên:
· Canny
· Sobel
ü Cân bằng histogram.
Xử lý video:
ü Captureü Resize Hình ảnh chương trình minh họa - Form chính của chương trình gồm có: khởi tạo menu, toolbar, statusbar, các action, các connect, các slot xử lý action. Lớp QImageProcessingSettingsDialog Đây là dialog dùng để chỉnh thông số của các phép xử lý ảnh gồm 5 tab:
· Binary Image: chỉnh ngưỡng convert sang ảnh đa mức xám trong dải 0 - 255;
· Smooth: Chọn 1 trong 3 phép lọc Blur, Gausian, Median, và chỉnh các parameters tương ứng với mỗi phép lọc.
· Dilation- Erosion: Các phép biến đổi hình thể, khi tick vào cả 2 thì sẽ chọn thực hiện phép đóng hay phép mở.
· Canny: Cho phép chọn ngưỡng và kích thước của mặt nạ lọc.
· Sobel: Cho phép chọn cấp đạo hàm theo trục x và y và kích thước của mặt nạ lọc.
Lớp QResizeImageDialogĐây là lớp dialog cho phép nhập kích thước mà ta muốn resize ảnh, cho phép giữ hay không giữ nguyên tỉ lệ.Lớp QChangeBrightnessAndContrastĐây là lớp dialog cho phép thay đổi độ sáng và độ tương phản của ảnh.Lớp QOpenCVWidgetĐây là lớp kế thừa từ lớp Widget thực hiện hiện ảnh lên Widget.Lớp QImageProcessingThreadĐây là lớp kế thừa từ lớp QThread thực hiện xử lý các phép biến đổi ảnhKhai báo QAction trong QFrmMain.h
Khởi tạo QAction trong QFrmMain.cpp
Action Convert To Binary Image
Action Convert to Grayscale Image
Action loc anh
Action Dilation image
Action erosion image
Action do bien Canny
Action do bien Sobel
Action histogram equalization
Action mở dialog setting
Ø Sau khi được chạy, m_threadImageProcessing sẽ kiểm tra các cờ trong struct, và dùng 1 bản clone của ảnh gốc để chỉnh sửa theo các tham số của struct. Ø Sau khi thực hiện chỉnh sửa xong, thread phát signal đã xong Ø frmMain nhận signal ảnh mới về và load ảnh lên. |
Lập trình xử lý ảnh cơ bản với thư viện OpenCV trên Linux Ubuntu
Reviewed by Jacky
on
tháng 11 04, 2017
Rating:
Không có nhận xét nào: