1 Thuật toán Phát hiện cạnh Canny
Bước 1: Giảm nhiễu
Thông thường để giảm nhiễu sử dụng các bộ lọc làm mờ. Có thể sử dụng bộ lọc
Gaussian để tích chập với ảnh:
Bước 2: Tính độ lớn và góc của Gradient
Roberts, Prewitt, Sobel.Tính đạo hàm ( ) và ( ) theo chiều x và y của ảnh. Một số bộ lọc như:
Bộ lọc Sobel 3×3:
Bước 3: chặn không cực đại (Non-Maximum Surpression)
Bước này chỉ giữ lại những pixel thuộc cạnh mà có độ lớn gradient lớn nhất
Xem xét 3 pixel trong vùng 3 x 3 xung quanh pixel (x,y):
– Nếu θ(x, y) = 00 thì (x+1, y), (x, y) và (x-1, y) được xem xét.
– Nếu θ(x, y) = 900 thì (x, y+1), (x, y) và (x, y-1).
– Nếu θ(x, y) = 450 thì (x+1, y+1), (x, y) và (x-1, y-1).
– Nếu θ(x, y) = 1350 thì (x-1, y+1), (x, y) và (x+1, y-1).
Nếu pixel (x, y) có gradient lớn nhất của 3 pixel xem xét thì pixel đó là cạnh.
Bước 4: Ngưỡng Hysteresis (Hysteresis Thresholding)
Hysteresis sử dụng 2 ngưỡng, ngưỡng thigh và tlow. Pixel mà có độ lớn gradient D < tlow thì được loại ngay lập tức. Những pixel tlow < D < thigh được giữ lại nếu là một cạnh liên tục với những pixel có độ lớn gradient D > thigh.
2 Cài đặt thuật toán phát hiện cạnh bằng OpenCV
Xây dựng class Canny như sau:
class Canny
{
protected:
IplImage *_srcImg, *_destImg;
int _width, _height;
int _lowThreshold, _maxThreshold;
public:
Canny(int low, int max)
{
_srcImg = NULL;
_destImg = NULL;
_lowThreshold = low;
_maxThreshold = max;
}
int CannyEdgeDetection(char *path);
};
Hàm CannyEdgedetection:
int Canny::CannyEdgeDetection(char *path)
{
_srcImg = cvLoadImage(path);
if(_srcImg == NULL)
return 0; cvNamedWindow(“Image”); cvShowImage(“Image”, _srcImg);
IplImage *grayImg, *blurImg;
grayImg = cvCreateImage(cvGetSize(_srcImg), IPL_DEPTH_8U, 1);
cvCvtColor(_srcImg, grayImg, CV_BGR2GRAY); cvNamedWindow(“Gray Image”); cvShowImage(“Gray Image”, grayImg);
blurImg = cvCreateImage(cvGetSize(_srcImg), IPL_DEPTH_8U, 1); cvSmooth(grayImg, blurImg, CV_GAUSSIAN, 5, 5); cvNamedWindow(“Blur Image”);
cvShowImage(“Blur Image”, blurImg);
_destImg = cvCreateImage(cvGetSize(_srcImg), IPL_DEPTH_8U, 1);
cvCanny(blurImg, _destImg, _lowThreshold, _maxThreshold, 3);
cvNamedWindow(“Canny Edge Detection”); cvShowImage(“Canny Edge Detection”,_destImg); return 1;
}
3 Bài tập
Viết chương trình phát hiện biên cạnh dựa vào thuật toán Canny như trong mục 1.
Tài liệu tham khảo
[1] Canny, J., A Computational Approach To Edge Detection, IEEE Trans. Pattern
Analysis and Machine Intelligence, 8(6):679–698, 1986.
Sản phẩm được quan tâm
Nhận bài viết mới
Các bài viết chia sẻ đến cộng đồng rất chât lượng, mang lại rất nhiều kiến thức mới. Đừng bỏ lỡ bất kỳ bài viết nào của chung tối, hãy đăng ký để nhận bài viết mới qua Mail của bạn
Đăng ký để không bỏ lỡ bài viết nào!
Bài mới
- Giáo trình Robocon
- Giới thiệu các loại board Esp8266 dành cho IoT và thiết lập cơ bản cho người mới học
- Hướng dẫn sử dụng LoraEasyV1
- Tài liệu tự học Python tiếng Việt cho người mới bắt đầu
- Tương lai của kết nối IoT (Internet of Things) tiềm năng và sự đa dạng
- HƯỚNG DẪN LẤP RÁP XE MÔ HÌNH 4 BÁNH
- HƯỚNG DẪN LẮP RÁP XE CHẠY BẰNG NĂNG LƯỢNG MẶT TRỜI
Danh mục