Nhận diện hình ảnh_Thuật toán Phát hiện cạnh Canny

No Comments

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!

Fields marked with an * are required

Danh mục




More from our blog

See all posts
No Comments
 

Leave a Comment