Lập trình OpenCV C++ Bài 10 : 4 Kỹ thuật làm mờ ảnh
Hi. chào mừng các bạn ghé thăm
Chủ đề lập trình OpenCV C++
Bài số 10 chúng ta sẽ cùng tìm hiểu về 4 kỹ thuật làm mờ ảnh.
Làm mờ ảnh là kỹ thuật được sử dụng phổ biến khi chỉnh sửa ảnh.
Trong photoshop, chức năng này cũng được sử dụng rất đa dạng.
Trong OpenGL có bốn hiệu ứng làm mờ ảnh cơ bản, Blur, Gaus Blur, Median Blur, Bilateral Blur
Chúng ta sẽ cùng thực hành với 4 kỹ thuật này.
Step 1: Tạo menu chức năng
Chúng ta sẽ tạo một menu item như sau trong project.
Các bạn vào resource, chọn menu, chọn
Các bạn thêm 4 menu item vào như sau:
Step 2: Viết hàm xử lý nhận sự kiện
Step 3: Định một nhóm biến 4 kiểu blur
Step 4: Chúng ta định nghĩa hàm xử lý blur bên lớp Document
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
void OpenCVGUIDoc::SmoothingImage(int type) { if (type == BLUR) { cv::Mat src = m_Mat; cv::Mat dst; for (int i = 1; i < MAX_KERNEL_LENGTH; i += 2) { cv::blur(src, dst, cv::Size(i, i), cv::Point(-1, -1)); } ImpShow(dst); } else if (type == GAUS_BLUR) { cv::Mat src = m_Mat; cv::Mat dst; for (int i = 1; i < MAX_KERNEL_LENGTH; i += 2) { cv::GaussianBlur(src, dst, cv::Size(i, i), 0, 0); } ImpShow(dst); } else if (type == MEDIAN_BLUR) { cv::Mat src = m_Mat; cv::Mat dst; for (int i = 1; i < MAX_KERNEL_LENGTH; i += 2) { cv::medianBlur(src, dst, i); } ImpShow(dst); } else { cv::Mat src = m_Mat; cv::Mat dst; for (int i = 1; i < MAX_KERNEL_LENGTH; i += 2) { cv::bilateralFilter(src, dst, i, i * 2, i / 2); } ImpShow(dst); } } |
định nghĩa MAX_KERNEL_LENGTH = 11 bên file header
#define MAX_KERNEL_LENGTH 11
Step 5: Sau đó chúng ta gọi xử lý smoothing của lớp document tại lớp mainframe
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
void MainFrame::ImageSmothing(UINT nId) { CMDIChildWnd* pChild = MDIGetActive(); if (pChild) { OpenCVGUIDoc* pDocument = (OpenCVGUIDoc*)pChild->GetActiveDocument(); if (pDocument) { if (nId == ID_SMOOTHING_BLUR) { pDocument->SmoothingImage(OpenCVGUIDoc::BLUR); } else if (nId == ID_SMOOTHING_GAUSBLUR) { pDocument->SmoothingImage(OpenCVGUIDoc::GAUS_BLUR); } else if (nId == ID_SMOOTHING_MEDIANBLUR) { pDocument->SmoothingImage(OpenCVGUIDoc::MEDIAN_BLUR); } else { pDocument->SmoothingImage(OpenCVGUIDoc::BILATE_BLUR); } } } } |
Chúng ta cùng xem kết quả
Ảnh gốc
Ảnh sau khi blur
ảnh sau khi gaus blur
ảnh sau khi median blur
Ảnh sau khi bilateral blur
Các bạn có thể thay đổi giá trị MAX_KERNEL_LENGTH để thấy sự khác biệt