2012-06-20 33 views
16

Bất cứ ai có thể mô tả làm thế nào tôi có thể thực hiện SWT trong python bằng cách sử dụng opencv hoặc simplecv?Thực hiện chuyển đổi chiều rộng đột quỵ (SWT) (Python)

+1

nếu bạn đang tìm kiếm triển khai giấy, bạn có thể thêm liên kết vào bài báo đó hoặc ít nhất cung cấp liên kết đến SWT là gì. –

+0

có thể hữu ích: http://stackoverflow.com/questions/4837124/stroke-width-transform-swt-implementation-java-c –

+0

tôi đã thấy chúng, nhưng liên kết bị hỏng và không có mã hoặc mã psudo nào có sẵn . – pylover

Trả lời

15

Ok như vậy ở đây đi:

Các liên kết có chi tiết về việc thực hiện với các liên kết tải mã ở dưới cùng: SWT

Vì lợi ích của sự hoàn chỉnh, cũng đề cập rằng SWT hoặc Stroke Width Chuyển đổi được được đưa ra bởi Epshtein và những người khác trong năm 2010 và đã trở thành một trong những phương pháp phát hiện văn bản thành công nhất cho tới nay. Nó không sử dụng máy học hoặc các bài kiểm tra phức tạp. Về cơ bản sau khi phát hiện cạnh Canny trên hình ảnh đầu vào, nó tính toán độ dày của mỗi đột quỵ tạo nên các đối tượng trong hình ảnh. Vì văn bản có nét dày đặc đều, đây có thể là một tính năng nhận dạng mạnh mẽ.

Thực hiện được đưa ra trong liên kết đang sử dụng C++, OpenCV và thư viện Boost mà chúng sử dụng cho các lần truyền tải biểu đồ được kết nối, v.v. sau khi tính toán bước SWT. Cá nhân tôi đã thử nghiệm nó trên Ubuntu và nó hoạt động khá tốt (và hiệu quả), mặc dù độ chính xác là không chính xác.

+0

Cảm ơn rất nhiều, một lần nữa – pylover

8

tôi thực hiện một cái gì đó tương tự như khoảng cách chuyển đổi dựa SWT được mô tả trong 'DETECTION TEXT mạnh mẽ trong HÌNH ẢNH TỰ NHIÊN VỚI KHU VỰC extremal tối đa ỔN ĐỊNH EDGE-NÂNG CAO bởi Huizhong Chen, Sam S. Tsai, Georg Schroth, David M. Chen, Radek Grzeszczuk, Bernd Girod '.

Nó không giống như mô tả trong bài báo mà là một xấp xỉ gần đúng phục vụ cho mục đích của tôi. Tôi nên chia sẻ nó để ai đó có thể thấy nó hữu ích (và chỉ ra bất kỳ lỗi/cải tiến nào). Nó được thực hiện trong C++ và sử dụng OpenCV.

// bw8u : we want to calculate the SWT of this. NOTE: Its background pixels are 0 and forground pixels are 1 (not 255!) 
    Mat bw32f, swt32f, kernel; 
    double min, max; 
    int strokeRadius; 

    bw8u.convertTo(bw32f, CV_32F); // format conversion for multiplication 
    distanceTransform(bw8u, swt32f, CV_DIST_L2, 5); // distance transform 
    minMaxLoc(swt32f, NULL, &max); // find max 
    strokeRadius = (int)ceil(max); // half the max stroke width 
    kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); // 3x3 kernel used to select 8-connected neighbors 

    for (int j = 0; j < strokeRadius; j++) 
    { 
     dilate(swt32f, swt32f, kernel); // assign the max in 3x3 neighborhood to each center pixel 
     swt32f = swt32f.mul(bw32f); // apply mask to restore original shape and to avoid unnecessary max propogation 
    } 
    // swt32f : resulting SWT image 
+0

Cực đại địa phương của Phép biến đổi khoảng cách sẽ mang lại độ rộng nửa nét. Đó là một quan sát tốt đẹp, mặc dù một số giấy tờ trong 2011-2012 sử dụng điều này chính xác kết hợp với các thiết bị dò vùng như MSER. – AruniRC

+1

@AruniRC Bài báo trong liên kết đã cho cung cấp chi tiết về phương pháp này. Trên thực tế điều này nửa chiều rộng chiều rộng không phải là quan sát của tôi. Thực sự xin lỗi nếu viết của tôi làm cho nó trông giống như nó là của tôi. Tất cả các tín dụng này nên đi đến các tác giả của bài báo này. – dhanushka

+1

Ồ, tôi không có ý đó. Chỉ là một quan sát. Và xin lỗi, lỗi của tôi vì không thấy liên kết giấy ICIP trước đó. Trong thực tế, việc sử dụng phép biến đổi khoảng cách để có được nửa chiều rộng là dễ dàng hơn và thanh lịch thực hiện khôn ngoan. Cá nhân, tôi đã sử dụng một toán tử Laplacian để lấy extrema địa phương của dist. xuyên. hình ảnh, nhưng cách làm giãn của bạn là sạch hơn. – AruniRC

Các vấn đề liên quan