Top Ad unit 728 × 90


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)
ü  Chỉ có hai màu đen, trắng (tương đương giá trị 1,0)
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 );
Convert from color to gray image



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)
Tham số:
– 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)
Sử dụng hàm cvSmooth với tham số smoothtype là CV_BLUR
Ø  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
Mean Filter

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
Gaussian Filter

Hình 4. Lọc Gaussian

Các phép xử lý hình thể

Ø  Phép giãn vùng ảnh: Dilation
Dilation

Hình 5. Phép giãn vùng ảnh (Dilation)

Ø  Phép co vùng ảnh: Erosion
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
Phepdong-Closing

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 Sobel

Hà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 Canny

Hà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
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



Dùng để khai báo các struct

- 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 ảnh

Khai báo QAction trong QFrmMain.h

Khởi tạo QAction trong QFrmMain.cpp

Khai báo slots trong QFrmMain.h

 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: 5

Không có nhận xét nào:

All Rights Reserved by Cộng Đồng OpenCV © 2017
Edit bởi: Jacky Le | Youtube Channel: JACKY LE

Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Được tạo bởi Blogger.